blob: 16866fd5549c0fe546d629f9fd2c7120caac5b53 [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 Kurek00644842023-05-30 05:45:00 -040023/* Define a local translating function to save code size by not using too many
24 * arguments in each translating place. */
Andrzej Kurek1c7a9982023-05-30 09:21:20 -040025#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED) || \
26 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Andrzej Kurek00644842023-05-30 05:45:00 -040027static int local_err_translation(psa_status_t status)
28{
29 return psa_status_to_mbedtls(status, psa_to_ssl_errors,
Andrzej Kurek1e4a0302023-05-30 09:45:17 -040030 ARRAY_LENGTH(psa_to_ssl_errors),
Andrzej Kurek00644842023-05-30 05:45:00 -040031 psa_generic_status_to_mbedtls);
32}
33#define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050034#endif
35
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020036#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000037#include "mbedtls/ecp.h"
Paul Bakker41c83d32013-03-20 14:39:14 +010038#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000039
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020040#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010041#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020042#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000043
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +010045int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl,
46 const unsigned char *info,
47 size_t ilen)
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020048{
Gilles Peskine449bd832023-01-11 14:50:10 +010049 if (ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER) {
50 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
51 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020052
Gilles Peskine449bd832023-01-11 14:50:10 +010053 mbedtls_free(ssl->cli_id);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020054
Gilles Peskine449bd832023-01-11 14:50:10 +010055 if ((ssl->cli_id = mbedtls_calloc(1, ilen)) == NULL) {
56 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
57 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020058
Gilles Peskine449bd832023-01-11 14:50:10 +010059 memcpy(ssl->cli_id, info, ilen);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020060 ssl->cli_id_len = ilen;
61
Gilles Peskine449bd832023-01-11 14:50:10 +010062 return 0;
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020063}
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020064
Gilles Peskine449bd832023-01-11 14:50:10 +010065void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf,
66 mbedtls_ssl_cookie_write_t *f_cookie_write,
67 mbedtls_ssl_cookie_check_t *f_cookie_check,
68 void *p_cookie)
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020069{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +020070 conf->f_cookie_write = f_cookie_write;
71 conf->f_cookie_check = f_cookie_check;
72 conf->p_cookie = p_cookie;
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020073}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020074#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020075
Gilles Peskineeccd8882020-03-10 12:19:08 +010076#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020077MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010078static int ssl_conf_has_psk_or_cb(mbedtls_ssl_config const *conf)
Hanno Becker845b9462018-10-26 12:07:29 +010079{
Gilles Peskine449bd832023-01-11 14:50:10 +010080 if (conf->f_psk != NULL) {
81 return 1;
82 }
Hanno Becker845b9462018-10-26 12:07:29 +010083
Gilles Peskine449bd832023-01-11 14:50:10 +010084 if (conf->psk_identity_len == 0 || conf->psk_identity == NULL) {
85 return 0;
86 }
Hanno Becker845b9462018-10-26 12:07:29 +010087
Hanno Becker845b9462018-10-26 12:07:29 +010088
Gilles Peskine449bd832023-01-11 14:50:10 +010089 if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
90 return 1;
91 }
Neil Armstrong8ecd6682022-05-05 11:40:35 +020092
Gilles Peskine449bd832023-01-11 14:50:10 +010093 if (conf->psk != NULL && conf->psk_len != 0) {
94 return 1;
95 }
Hanno Becker845b9462018-10-26 12:07:29 +010096
Gilles Peskine449bd832023-01-11 14:50:10 +010097 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +010098}
Gilles Peskineeccd8882020-03-10 12:19:08 +010099#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker845b9462018-10-26 12:07:29 +0100100
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200101MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100102static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl,
103 const unsigned char *buf,
104 size_t len)
Paul Bakker48916f92012-09-16 19:57:18 +0000105{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100107 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100108 /* Check verify-data in constant-time. The length OTOH is no secret */
Gilles Peskine449bd832023-01-11 14:50:10 +0100109 if (len != 1 + ssl->verify_data_len ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100110 buf[0] != ssl->verify_data_len ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100111 mbedtls_ct_memcmp(buf + 1, ssl->peer_verify_data,
112 ssl->verify_data_len) != 0) {
113 MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info"));
114 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
115 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
116 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100117 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100118 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200119#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +0000120 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100121 if (len != 1 || buf[0] != 0x0) {
122 MBEDTLS_SSL_DEBUG_MSG(1, ("non-zero length renegotiation info"));
123 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
124 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
125 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +0000126 }
127
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200128 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +0000129 }
Paul Bakker48916f92012-09-16 19:57:18 +0000130
Gilles Peskine449bd832023-01-11 14:50:10 +0100131 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +0000132}
133
Valerio Setti60d3b912023-07-25 10:43:53 +0200134#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200135 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100136 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub925f212022-01-12 11:17:02 +0800137/*
Jerry Yud491ea42022-01-13 16:15:25 +0800138 * Function for parsing a supported groups (TLS 1.3) or supported elliptic
139 * curves (TLS 1.2) extension.
140 *
141 * The "extension_data" field of a supported groups extension contains a
142 * "NamedGroupList" value (TLS 1.3 RFC8446):
143 * enum {
144 * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
145 * x25519(0x001D), x448(0x001E),
146 * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
147 * ffdhe6144(0x0103), ffdhe8192(0x0104),
148 * ffdhe_private_use(0x01FC..0x01FF),
149 * ecdhe_private_use(0xFE00..0xFEFF),
150 * (0xFFFF)
151 * } NamedGroup;
152 * struct {
153 * NamedGroup named_group_list<2..2^16-1>;
154 * } NamedGroupList;
155 *
156 * The "extension_data" field of a supported elliptic curves extension contains
157 * a "NamedCurveList" value (TLS 1.2 RFC 8422):
158 * enum {
159 * deprecated(1..22),
160 * secp256r1 (23), secp384r1 (24), secp521r1 (25),
161 * x25519(29), x448(30),
162 * reserved (0xFE00..0xFEFF),
163 * deprecated(0xFF01..0xFF02),
164 * (0xFFFF)
165 * } NamedCurve;
166 * struct {
167 * NamedCurve named_curve_list<2..2^16-1>
168 * } NamedCurveList;
169 *
Jerry Yub925f212022-01-12 11:17:02 +0800170 * The TLS 1.3 supported groups extension was defined to be a compatible
171 * generalization of the TLS 1.2 supported elliptic curves extension. They both
172 * share the same extension identifier.
Jerry Yud491ea42022-01-13 16:15:25 +0800173 *
Jerry Yub925f212022-01-12 11:17:02 +0800174 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200175MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100176static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
177 const unsigned char *buf,
178 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100179{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200180 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100181 const unsigned char *p;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100182 uint16_t *curves_tls_id;
Paul Bakker41c83d32013-03-20 14:39:14 +0100183
Gilles Peskine449bd832023-01-11 14:50:10 +0100184 if (len < 2) {
185 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
186 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
187 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
188 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +0200189 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000190 list_size = MBEDTLS_GET_UINT16_BE(buf, 0);
Gilles Peskine449bd832023-01-11 14:50:10 +0100191 if (list_size + 2 != len ||
192 list_size % 2 != 0) {
193 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
194 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
195 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
196 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100197 }
198
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200199 /* Should never happen unless client duplicates the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100200 if (ssl->handshake->curves_tls_id != NULL) {
201 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
202 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
203 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
204 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200205 }
206
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100207 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200208 * and leave room for a final 0 */
209 our_size = list_size / 2 + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 if (our_size > MBEDTLS_ECP_DP_MAX) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200211 our_size = MBEDTLS_ECP_DP_MAX;
Gilles Peskine449bd832023-01-11 14:50:10 +0100212 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200213
Gilles Peskine449bd832023-01-11 14:50:10 +0100214 if ((curves_tls_id = mbedtls_calloc(our_size,
215 sizeof(*curves_tls_id))) == NULL) {
216 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
217 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
218 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200219 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200220
Valerio Setti18c9fed2022-12-30 17:44:24 +0100221 ssl->handshake->curves_tls_id = curves_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200222
Paul Bakker41c83d32013-03-20 14:39:14 +0100223 p = buf + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100224 while (list_size > 0 && our_size > 1) {
225 uint16_t curr_tls_id = MBEDTLS_GET_UINT16_BE(p, 0);
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200226
Gilles Peskine449bd832023-01-11 14:50:10 +0100227 if (mbedtls_ssl_get_ecp_group_id_from_tls_id(curr_tls_id) !=
228 MBEDTLS_ECP_DP_NONE) {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100229 *curves_tls_id++ = curr_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200230 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100231 }
232
233 list_size -= 2;
234 p += 2;
235 }
236
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100238}
239
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200240MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100241static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl,
242 const unsigned char *buf,
243 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100244{
245 size_t list_size;
246 const unsigned char *p;
247
Gilles Peskine449bd832023-01-11 14:50:10 +0100248 if (len == 0 || (size_t) (buf[0] + 1) != len) {
249 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
250 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
251 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
252 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100253 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200254 list_size = buf[0];
Paul Bakker41c83d32013-03-20 14:39:14 +0100255
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200256 p = buf + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100257 while (list_size > 0) {
258 if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
259 p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100260 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
261 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100262 }
263
264 list_size--;
265 p++;
266 }
267
Gilles Peskine449bd832023-01-11 14:50:10 +0100268 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100269}
Valerio Setti60d3b912023-07-25 10:43:53 +0200270#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +0200271 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +0200272 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100273
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200274#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200275MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100276static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
277 const unsigned char *buf,
278 size_t len)
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200279{
Janos Follath865b3eb2019-12-16 11:46:15 +0000280 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200281
Manuel Pégourié-Gonnard58916762025-01-23 10:48:45 +0100282 if (ssl->handshake->psa_pake_ctx_is_ok != 1) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100283 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
284 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200285 }
286
Gilles Peskine449bd832023-01-11 14:50:10 +0100287 if ((ret = mbedtls_psa_ecjpake_read_round(
288 &ssl->handshake->psa_pake_ctx, buf, len,
289 MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
290 psa_destroy_key(ssl->handshake->psa_pake_password);
291 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200292
Gilles Peskine449bd832023-01-11 14:50:10 +0100293 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
Valerio Setti02c25b52022-11-15 14:08:42 +0100294 mbedtls_ssl_send_alert_message(
Gilles Peskine449bd832023-01-11 14:50:10 +0100295 ssl,
296 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
297 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200298
Gilles Peskine449bd832023-01-11 14:50:10 +0100299 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200300 }
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200301
302 /* Only mark the extension as OK when we're sure it is */
303 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
304
Gilles Peskine449bd832023-01-11 14:50:10 +0100305 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200306}
307#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
308
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200310MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100311static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
312 const unsigned char *buf,
313 size_t len)
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200314{
Gilles Peskine449bd832023-01-11 14:50:10 +0100315 if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
316 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
317 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
318 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
319 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200320 }
321
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200322 ssl->session_negotiate->mfl_code = buf[0];
323
Gilles Peskine449bd832023-01-11 14:50:10 +0100324 return 0;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200325}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200326#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200327
Hanno Beckera0e20d02019-05-15 14:03:01 +0100328#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200329MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100330static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
331 const unsigned char *buf,
332 size_t len)
Hanno Becker89dcc882019-04-26 13:56:39 +0100333{
334 size_t peer_cid_len;
335
336 /* CID extension only makes sense in DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100337 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
338 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
339 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
340 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
341 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100342 }
343
344 /*
Hanno Becker89dcc882019-04-26 13:56:39 +0100345 * struct {
346 * opaque cid<0..2^8-1>;
347 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +0100348 */
Hanno Becker89dcc882019-04-26 13:56:39 +0100349
Gilles Peskine449bd832023-01-11 14:50:10 +0100350 if (len < 1) {
351 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
352 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
353 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
354 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100355 }
356
357 peer_cid_len = *buf++;
358 len--;
359
Gilles Peskine449bd832023-01-11 14:50:10 +0100360 if (len != peer_cid_len) {
361 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
362 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
363 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
364 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100365 }
366
367 /* Ignore CID if the user has disabled its use. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100368 if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker89dcc882019-04-26 13:56:39 +0100369 /* Leave ssl->handshake->cid_in_use in its default
370 * value of MBEDTLS_SSL_CID_DISABLED. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100371 MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled"));
372 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100373 }
374
Gilles Peskine449bd832023-01-11 14:50:10 +0100375 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
376 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
377 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
378 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
379 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100380 }
381
Hanno Becker08556bf2019-05-03 12:43:44 +0100382 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker89dcc882019-04-26 13:56:39 +0100383 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100384 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100385
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
387 MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100388
Gilles Peskine449bd832023-01-11 14:50:10 +0100389 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100390}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100391#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200393#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200394MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100395static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
396 const unsigned char *buf,
397 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100398{
Gilles Peskine449bd832023-01-11 14:50:10 +0100399 if (len != 0) {
400 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
401 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
402 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
403 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100404 }
405
406 ((void) buf);
407
Gilles Peskine449bd832023-01-11 14:50:10 +0100408 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100410 }
411
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100413}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200414#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100415
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200417MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100418static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
419 const unsigned char *buf,
420 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200421{
Gilles Peskine449bd832023-01-11 14:50:10 +0100422 if (len != 0) {
423 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
424 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
425 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
426 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200427 }
428
429 ((void) buf);
430
Gilles Peskine449bd832023-01-11 14:50:10 +0100431 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200432 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200433 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200434
Gilles Peskine449bd832023-01-11 14:50:10 +0100435 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200436}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200437#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200438
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200439#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200440MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100441static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
442 unsigned char *buf,
443 size_t len)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200444{
Janos Follath865b3eb2019-12-16 11:46:15 +0000445 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200446 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200447
Gilles Peskine449bd832023-01-11 14:50:10 +0100448 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200449
Gilles Peskine449bd832023-01-11 14:50:10 +0100450 if (ssl->conf->f_ticket_parse == NULL ||
451 ssl->conf->f_ticket_write == NULL) {
452 return 0;
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200453 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200454
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200455 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200456 ssl->handshake->new_session_ticket = 1;
457
Gilles Peskine449bd832023-01-11 14:50:10 +0100458 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200459
Gilles Peskine449bd832023-01-11 14:50:10 +0100460 if (len == 0) {
461 return 0;
462 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200463
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200464#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100465 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
466 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
467 return 0;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200468 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200469#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200470
471 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200472 * Failures are ok: just ignore the ticket and proceed.
473 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100474 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session,
475 buf, len)) != 0) {
476 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200477
Gilles Peskine449bd832023-01-11 14:50:10 +0100478 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
479 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
480 } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
481 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
482 } else {
483 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
484 }
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200485
Gilles Peskine449bd832023-01-11 14:50:10 +0100486 return 0;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200487 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200488
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200489 /*
490 * Keep the session ID sent by the client, since we MUST send it back to
491 * inform them we're accepting the ticket (RFC 5077 section 3.4)
492 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200493 session.id_len = ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100494 memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200495
Gilles Peskine449bd832023-01-11 14:50:10 +0100496 mbedtls_ssl_session_free(ssl->session_negotiate);
497 memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200498
499 /* Zeroize instead of free as we copied the content */
Gilles Peskine449bd832023-01-11 14:50:10 +0100500 mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200501
Gilles Peskine449bd832023-01-11 14:50:10 +0100502 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200503
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200504 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200505
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200506 /* Don't send a new ticket after all, this one is OK */
507 ssl->handshake->new_session_ticket = 0;
508
Gilles Peskine449bd832023-01-11 14:50:10 +0100509 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200510}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200511#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200512
Johan Pascalb62bb512015-12-03 21:56:45 +0100513#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200514MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100515static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
516 const unsigned char *buf,
517 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100518{
Johan Pascal43f94902020-09-22 12:25:52 +0200519 mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
Gilles Peskine449bd832023-01-11 14:50:10 +0100520 size_t i, j;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200521 size_t profile_length;
522 uint16_t mki_length;
Ron Eldor313d7b52018-12-10 14:56:21 +0200523 /*! 2 bytes for profile length and 1 byte for mki len */
524 const size_t size_of_lengths = 3;
Johan Pascalb62bb512015-12-03 21:56:45 +0100525
526 /* If use_srtp is not configured, just ignore the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100527 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
528 (ssl->conf->dtls_srtp_profile_list == NULL) ||
529 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
530 return 0;
Johan Pascal85269572020-08-25 10:01:54 +0200531 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100532
533 /* RFC5764 section 4.1.1
534 * uint8 SRTPProtectionProfile[2];
535 *
536 * struct {
537 * SRTPProtectionProfiles SRTPProtectionProfiles;
538 * opaque srtp_mki<0..255>;
539 * } UseSRTPData;
540
541 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100542 */
543
Ron Eldoref72faf2018-07-12 11:54:20 +0300544 /*
545 * Min length is 5: at least one protection profile(2 bytes)
546 * and length(2 bytes) + srtp_mki length(1 byte)
Johan Pascal042d4562020-08-25 12:14:02 +0200547 * Check here that we have at least 2 bytes of protection profiles length
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200548 * and one of srtp_mki length
Ron Eldoref72faf2018-07-12 11:54:20 +0300549 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100550 if (len < size_of_lengths) {
551 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
552 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
553 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200554 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100555
Gilles Peskine449bd832023-01-11 14:50:10 +0100556 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200557
Ron Eldoref72faf2018-07-12 11:54:20 +0300558 /* first 2 bytes are protection profile length(in bytes) */
Gilles Peskine449bd832023-01-11 14:50:10 +0100559 profile_length = (buf[0] << 8) | buf[1];
Johan Pascal042d4562020-08-25 12:14:02 +0200560 buf += 2;
Ron Eldor591f1622018-01-22 12:30:04 +0200561
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200562 /* The profile length cannot be bigger than input buffer size - lengths fields */
Gilles Peskine449bd832023-01-11 14:50:10 +0100563 if (profile_length > len - size_of_lengths ||
564 profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */
565 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
566 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
567 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200568 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300569 /*
570 * parse the extension list values are defined in
571 * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
572 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100573 for (j = 0; j < profile_length; j += 2) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200574 uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
Gilles Peskine449bd832023-01-11 14:50:10 +0100575 client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
Johan Pascalb62bb512015-12-03 21:56:45 +0100576
Gilles Peskine449bd832023-01-11 14:50:10 +0100577 if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
578 MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
579 mbedtls_ssl_get_srtp_profile_as_string(
580 client_protection)));
581 } else {
Johan Pascal85269572020-08-25 10:01:54 +0200582 continue;
583 }
Ron Eldor591f1622018-01-22 12:30:04 +0200584 /* check if suggested profile is in our list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100585 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
586 if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
Ron Eldor3adb9922017-12-21 10:15:08 +0200587 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100588 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
589 mbedtls_ssl_get_srtp_profile_as_string(
590 client_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +0200591 break;
Johan Pascalb62bb512015-12-03 21:56:45 +0100592 }
593 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100594 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) {
Ron Eldor591f1622018-01-22 12:30:04 +0200595 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100596 }
Ron Eldor591f1622018-01-22 12:30:04 +0200597 }
Johan Pascal042d4562020-08-25 12:14:02 +0200598 buf += profile_length; /* buf points to the mki length */
599 mki_length = *buf;
600 buf++;
Ron Eldor591f1622018-01-22 12:30:04 +0200601
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
603 mki_length + profile_length + size_of_lengths != len) {
604 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
605 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
606 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Johan Pascal042d4562020-08-25 12:14:02 +0200607 }
608
609 /* Parse the mki only if present and mki is supported locally */
Gilles Peskine449bd832023-01-11 14:50:10 +0100610 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
611 mki_length > 0) {
Johan Pascal042d4562020-08-25 12:14:02 +0200612 ssl->dtls_srtp_info.mki_len = mki_length;
613
Gilles Peskine449bd832023-01-11 14:50:10 +0100614 memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
Ron Eldorb4655392018-07-05 18:25:39 +0300615
Gilles Peskine449bd832023-01-11 14:50:10 +0100616 MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value,
617 ssl->dtls_srtp_info.mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100618 }
619
Gilles Peskine449bd832023-01-11 14:50:10 +0100620 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100621}
622#endif /* MBEDTLS_SSL_DTLS_SRTP */
623
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100624/*
625 * Auxiliary functions for ServerHello parsing and related actions
626 */
627
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100629/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100630 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100631 */
Valerio Settie9646ec2023-08-02 20:02:28 +0200632#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200633MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100634static int ssl_check_key_curve(mbedtls_pk_context *pk,
635 uint16_t *curves_tls_id)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100636{
Valerio Setti18c9fed2022-12-30 17:44:24 +0100637 uint16_t *curr_tls_id = curves_tls_id;
Valerio Settif9362b72023-11-29 08:42:27 +0100638 mbedtls_ecp_group_id grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Setti18c9fed2022-12-30 17:44:24 +0100639 mbedtls_ecp_group_id curr_grp_id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100640
Gilles Peskine449bd832023-01-11 14:50:10 +0100641 while (*curr_tls_id != 0) {
642 curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
643 if (curr_grp_id == grp_id) {
644 return 0;
645 }
Valerio Setti18c9fed2022-12-30 17:44:24 +0100646 curr_tls_id++;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100647 }
648
Gilles Peskine449bd832023-01-11 14:50:10 +0100649 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100650}
Valerio Settie9646ec2023-08-02 20:02:28 +0200651#endif /* MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100652
653/*
654 * Try picking a certificate for this ciphersuite,
655 * return 0 on success and -1 on failure.
656 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200657MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100658static int ssl_pick_cert(mbedtls_ssl_context *ssl,
659 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100660{
Glenn Strauss041a3762022-03-15 06:08:29 -0400661 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200662 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100663 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200664 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100665 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200666 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100667
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200668#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100669 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100670 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100671 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100672#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100673 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100674
David Horstmann3a334c22022-10-25 10:53:44 +0100675 int pk_alg_is_none = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100676 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Gilles Peskine449bd832023-01-11 14:50:10 +0100677 if (pk_alg_is_none) {
678 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200679 }
680
Gilles Peskine449bd832023-01-11 14:50:10 +0100681 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
682
683 if (list == NULL) {
684 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
685 return -1;
686 }
687
688 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400689 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100690 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
691 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000692
David Horstmann3a334c22022-10-25 10:53:44 +0100693 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200694#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100695 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
696 ssl->conf->f_async_decrypt_start != NULL ||
697 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
698 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200699#else
David Horstmann3a334c22022-10-25 10:53:44 +0100700 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100701 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200702#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100703 if (!key_type_matches) {
704 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100705 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000706 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100707
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200708 /*
709 * This avoids sending the client a cert it'll reject based on
710 * keyUsage or other extensions.
711 *
712 * It also allows the user to provision different certificates for
713 * different uses based on keyUsage, eg if they want to avoid signing
714 * and decrypting with the same RSA key.
715 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100716 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
Manuel Pégourié-Gonnard7a4aa4d2024-08-09 11:49:12 +0200717 MBEDTLS_SSL_IS_CLIENT,
718 MBEDTLS_SSL_VERSION_TLS1_2,
719 &flags) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100720 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
721 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200722 continue;
723 }
724
Valerio Settie9646ec2023-08-02 20:02:28 +0200725#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100726 if (pk_alg == MBEDTLS_PK_ECDSA &&
727 ssl_check_key_curve(&cur->cert->pk,
728 ssl->handshake->curves_tls_id) != 0) {
729 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100730 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000731 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100732#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100733
734 /* If we get there, we got a winner */
735 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100736 }
737
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200738 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100739 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100740 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100741 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
742 ssl->handshake->key_cert->cert);
743 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100744 }
745
Gilles Peskine449bd832023-01-11 14:50:10 +0100746 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100747}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200748#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100749
750/*
751 * Check if a given ciphersuite is suitable for use with our config/keys/etc
752 * Sets ciphersuite_info only if the suite matches.
753 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200754MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100755static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
756 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100757{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200758 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100759
Jerry Yue7541932022-01-28 10:21:24 +0800760#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100761 mbedtls_pk_type_t sig_type;
762#endif
763
Gilles Peskine449bd832023-01-11 14:50:10 +0100764 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
765 if (suite_info == NULL) {
766 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
767 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100768 }
769
Gilles Peskine449bd832023-01-11 14:50:10 +0100770 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
771 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000772
Gilles Peskine449bd832023-01-11 14:50:10 +0100773 if (suite_info->min_tls_version > ssl->tls_version ||
774 suite_info->max_tls_version < ssl->tls_version) {
775 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
776 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000777 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100778
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200779#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
781 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
782 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
783 "not configured or ext missing"));
784 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200785 }
786#endif
787
788
Valerio Setti60d3b912023-07-25 10:43:53 +0200789#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200790 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100791 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
792 (ssl->handshake->curves_tls_id == NULL ||
793 ssl->handshake->curves_tls_id[0] == 0)) {
794 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
795 "no common elliptic curve"));
796 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000797 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100798#endif
799
Gilles Peskineeccd8882020-03-10 12:19:08 +0100800#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100801 /* If the ciphersuite requires a pre-shared key and we don't
802 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100803 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
804 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
805 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
806 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000807 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100808#endif
809
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200810#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100811 /*
812 * Final check: if ciphersuite requires us to have a
813 * certificate/key of a particular type:
814 * - select the appropriate certificate if we have one, or
815 * - try the next ciphersuite if we don't
816 * This must be done last since we modify the key_cert list.
817 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100818 if (ssl_pick_cert(ssl, suite_info) != 0) {
819 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
820 "no suitable certificate"));
821 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000822 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100823#endif
824
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200825#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
826 /* If the ciphersuite requires signing, check whether
827 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100828 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
829 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200830 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100831 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
832 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
833 "for signature algorithm %u", (unsigned) sig_type));
834 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200835 }
836
837#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
838
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100839 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100840 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100841}
842
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200843/* This function doesn't alert on errors that happen early during
844 ClientHello parsing because they might indicate that the client is
845 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200846MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100847static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000848{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100849 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200850 size_t i, j;
851 size_t ciph_offset, comp_offset, ext_offset;
852 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200853#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200854 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100855#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000856 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200857#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000858 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100859#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000860 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200861 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200862 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000863
Hanno Becker7e5437a2017-04-28 17:15:26 +0100864 /* If there is no signature-algorithm extension present,
865 * we need to fall back to the default values for allowed
866 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800867#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100868 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800869#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100870
Gilles Peskine449bd832023-01-11 14:50:10 +0100871 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000872
David Horstmanne0af39a2022-10-06 18:19:18 +0100873 int renegotiating;
874
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200875#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200876read_record_header:
877#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100878 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200879 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100880 * otherwise read it ourselves manually in order to support SSLv2
881 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100882 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
883 * ClientHello has been already fully fetched by the TLS 1.3 code and the
884 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100885 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100886 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200887#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100888 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100889#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100890 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100891 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200892 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100893 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
894 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000895 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000896 }
897
898 buf = ssl->in_hdr;
899
Gilles Peskine449bd832023-01-11 14:50:10 +0100900 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000901
Paul Bakkerec636f32012-09-09 19:17:02 +0000902 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100903 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000904 *
905 * Record layer:
906 * 0 . 0 message type
907 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200908 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000909 * 3 . 4 message length
910 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100911 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
912 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100913
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
915 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
916 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100917 }
918
Gilles Peskine449bd832023-01-11 14:50:10 +0100919 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000920 MBEDTLS_GET_UINT16_BE(ssl->in_len, 0)));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100921
Gilles Peskine449bd832023-01-11 14:50:10 +0100922 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
923 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100924
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200925 /* For DTLS if this is the initial handshake, remember the client sequence
926 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200927#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100928 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200929#if defined(MBEDTLS_SSL_RENEGOTIATION)
930 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000931#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100932 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200933 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100934 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
935 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
936 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200937 }
938
Gilles Peskine449bd832023-01-11 14:50:10 +0100939 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
940 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200941
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200942#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100943 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
944 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200945 ssl->next_record_offset = 0;
946 ssl->in_left = 0;
947 goto read_record_header;
948 }
949
950 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +0100951 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200952#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200953 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200954#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200955
Dave Rodgmana3d0f612023-11-03 23:34:02 +0000956 msg_len = MBEDTLS_GET_UINT16_BE(ssl->in_len, 0);
Paul Bakker5121ce52009-01-03 21:22:43 +0000957
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200958#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200960 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +0000961 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +0100962 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100963#endif
Paul Bakkerec636f32012-09-09 19:17:02 +0000964 {
Ronald Cron6291b232023-03-08 15:51:25 +0100965 if (ssl->keep_current_message) {
966 ssl->keep_current_message = 0;
967 } else {
968 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
969 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
970 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
971 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000972
Ronald Cron6291b232023-03-08 15:51:25 +0100973 if ((ret = mbedtls_ssl_fetch_input(ssl,
974 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
975 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
976 return ret;
977 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200978
Ronald Cron6291b232023-03-08 15:51:25 +0100979 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200980#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +0100981 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
982 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
983 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +0200984#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100985 ssl->in_left = 0;
986 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +0100987 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000988
989 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +0000990
Gilles Peskine449bd832023-01-11 14:50:10 +0100991 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +0100992
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +0100993 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
994 if (0 != ret) {
995 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
996 return ret;
997 }
Paul Bakkerec636f32012-09-09 19:17:02 +0000998
999 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001000 * Handshake layer:
1001 * 0 . 0 handshake type
1002 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001003 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001004 * 6 . 8 DTLS only: fragment offset
1005 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001006 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001007 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1008 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1009 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001010 }
1011
Gilles Peskine449bd832023-01-11 14:50:10 +01001012 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001013
Gilles Peskine449bd832023-01-11 14:50:10 +01001014 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1015 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1016 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001017 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001018 {
Gilles Peskine449bd832023-01-11 14:50:10 +01001019 size_t handshake_len = MBEDTLS_GET_UINT24_BE(buf, 1);
1020 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %u",
1021 (unsigned) handshake_len));
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001022
1023 /* The record layer has a record size limit of 2^14 - 1 and
1024 * fragmentation is not supported, so buf[1] should be zero. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001025 if (buf[1] != 0) {
1026 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != 0",
1027 (unsigned) buf[1]));
1028 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001029 }
1030
1031 /* We don't support fragmentation of ClientHello (yet?) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001032 if (msg_len != mbedtls_ssl_hs_hdr_len(ssl) + handshake_len) {
1033 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != %u + %u",
1034 (unsigned) msg_len,
1035 (unsigned) mbedtls_ssl_hs_hdr_len(ssl),
1036 (unsigned) handshake_len));
1037 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001038 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001039 }
1040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001042 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001043 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001044 * Copy the client's handshake message_seq on initial handshakes,
1045 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001046 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001047#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001048 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001049 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001050 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001051 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1052 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1053 "%u (expected %u)", cli_msg_seq,
1054 ssl->handshake->in_msg_seq));
1055 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001056 }
1057
1058 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001059 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001060#endif
1061 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001062 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001063 ssl->handshake->out_msg_seq = cli_msg_seq;
1064 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1065 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001066 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001067 /*
1068 * For now we don't support fragmentation, so make sure
1069 * fragment_offset == 0 and fragment_length == length
1070 */
1071 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001072 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1073 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1074 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001075 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001076 4, ("fragment_offset=%u fragment_length=%u length=%u",
1077 (unsigned) fragment_offset, (unsigned) fragment_length,
1078 (unsigned) length));
1079 if (fragment_offset != 0 || length != fragment_length) {
1080 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1081 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001082 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001083 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001084 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001085#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001086
Gilles Peskine449bd832023-01-11 14:50:10 +01001087 buf += mbedtls_ssl_hs_hdr_len(ssl);
1088 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001089
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001090 /*
Wenxing Hou3b9de382023-12-14 16:22:01 +08001091 * ClientHello layout:
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001092 * 0 . 1 protocol version
1093 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
Wenxing Hou3b9de382023-12-14 16:22:01 +08001094 * 34 . 34 session id length (1 byte)
1095 * 35 . 34+x session id, where x = session id length from byte 34
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001096 * 35+x . 35+x DTLS only: cookie length (1 byte)
1097 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001098 * .. . .. ciphersuite list length (2 bytes)
1099 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001100 * .. . .. compression alg. list length (1 byte)
1101 * .. . .. compression alg. list
1102 * .. . .. extensions length (2 bytes, optional)
1103 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001104 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001105
1106 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001107 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001108 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1109 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001110 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001111 if (msg_len < 38) {
1112 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1113 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001114 }
1115
1116 /*
1117 * Check and save the protocol version
1118 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001119 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001120
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001121 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1122 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001123 ssl->session_negotiate->tls_version = ssl->tls_version;
Ronald Cron17ef8df2023-11-22 10:29:42 +01001124 ssl->session_negotiate->endpoint = ssl->conf->endpoint;
Paul Bakkerec636f32012-09-09 19:17:02 +00001125
Gilles Peskine449bd832023-01-11 14:50:10 +01001126 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1127 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1128 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1129 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1130 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001131 }
1132
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001133 /*
1134 * Save client random (inc. Unix time)
1135 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001136 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001137
Gilles Peskine449bd832023-01-11 14:50:10 +01001138 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001139
1140 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001141 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001142 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001143 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001144
Gilles Peskine449bd832023-01-11 14:50:10 +01001145 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1146 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1147 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1148 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1149 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1150 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001151 }
1152
Gilles Peskine449bd832023-01-11 14:50:10 +01001153 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001154
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001155 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001156 memset(ssl->session_negotiate->id, 0,
1157 sizeof(ssl->session_negotiate->id));
1158 memcpy(ssl->session_negotiate->id, buf + 35,
1159 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001160
1161 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001162 * Check the cookie length and content
1163 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001164#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001165 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001166 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001167 cookie_len = buf[cookie_offset];
1168
Gilles Peskine449bd832023-01-11 14:50:10 +01001169 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1170 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1171 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1172 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1173 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001174 }
1175
Gilles Peskine449bd832023-01-11 14:50:10 +01001176 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1177 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001178
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001179#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001180 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001181#if defined(MBEDTLS_SSL_RENEGOTIATION)
1182 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001183#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001184 ) {
1185 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1186 buf + cookie_offset + 1, cookie_len,
1187 ssl->cli_id, ssl->cli_id_len) != 0) {
1188 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001189 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001190 } else {
1191 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001192 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001193 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001194 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001195#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001196 {
1197 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001198 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001199 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001200 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1201 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001202 }
1203
Gilles Peskine449bd832023-01-11 14:50:10 +01001204 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001205 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001206
Gilles Peskine449bd832023-01-11 14:50:10 +01001207 /*
1208 * Check the ciphersuitelist length (will be parsed later)
1209 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001210 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001211 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001212#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001213 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001214
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001215 ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001216
Gilles Peskine449bd832023-01-11 14:50:10 +01001217 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001218 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001219 (ciph_len % 2) != 0) {
1220 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1221 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1222 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1223 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001224 }
1225
Gilles Peskine449bd832023-01-11 14:50:10 +01001226 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1227 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001228
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001229 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001230 * Check the compression algorithm's length.
1231 * The list contents are ignored because implementing
1232 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1233 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001234 */
1235 comp_offset = ciph_offset + 2 + ciph_len;
1236
1237 comp_len = buf[comp_offset];
1238
Gilles Peskine449bd832023-01-11 14:50:10 +01001239 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001240 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001241 comp_len + comp_offset + 1 > msg_len) {
1242 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1243 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1244 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1245 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001246 }
1247
Gilles Peskine449bd832023-01-11 14:50:10 +01001248 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1249 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001250
Gilles Peskine449bd832023-01-11 14:50:10 +01001251 /*
1252 * Check the extension length
1253 */
1254 ext_offset = comp_offset + 1 + comp_len;
1255 if (msg_len > ext_offset) {
1256 if (msg_len < ext_offset + 2) {
1257 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1258 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1259 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1260 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001261 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001262
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001263 ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001264
Gilles Peskine449bd832023-01-11 14:50:10 +01001265 if (msg_len != ext_offset + 2 + ext_len) {
1266 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1267 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1268 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1269 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1270 }
1271 } else {
1272 ext_len = 0;
1273 }
Paul Bakker48916f92012-09-16 19:57:18 +00001274
Gilles Peskine449bd832023-01-11 14:50:10 +01001275 ext = buf + ext_offset + 2;
1276 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1277
1278 while (ext_len != 0) {
1279 unsigned int ext_id;
1280 unsigned int ext_size;
1281 if (ext_len < 4) {
1282 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1283 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1284 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1285 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1286 }
Dave Rodgmana3d0f612023-11-03 23:34:02 +00001287 ext_id = MBEDTLS_GET_UINT16_BE(ext, 0);
1288 ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
Gilles Peskine449bd832023-01-11 14:50:10 +01001289
1290 if (ext_size + 4 > ext_len) {
1291 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1292 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1293 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1294 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1295 }
1296 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001297#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001298 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001299 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1300 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1301 ext + 4 + ext_size);
1302 if (ret != 0) {
1303 return ret;
1304 }
Simon Butcher584a5472016-05-23 16:24:52 +01001305 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001306#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001307
Simon Butcher584a5472016-05-23 16:24:52 +01001308 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001309 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001310#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001311 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001312#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001313
Gilles Peskine449bd832023-01-11 14:50:10 +01001314 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1315 if (ret != 0) {
1316 return ret;
1317 }
Simon Butcher584a5472016-05-23 16:24:52 +01001318 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001319
Jerry Yue7541932022-01-28 10:21:24 +08001320#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001321 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001322 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001323
Gilles Peskine449bd832023-01-11 14:50:10 +01001324 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1325 if (ret != 0) {
1326 return ret;
1327 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001328
1329 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001330 break;
Jerry Yue7541932022-01-28 10:21:24 +08001331#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001332
Valerio Setti60d3b912023-07-25 10:43:53 +02001333#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001334 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001335 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001336 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001337 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001338
Gilles Peskine449bd832023-01-11 14:50:10 +01001339 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1340 if (ret != 0) {
1341 return ret;
1342 }
Simon Butcher584a5472016-05-23 16:24:52 +01001343 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001344
Simon Butcher584a5472016-05-23 16:24:52 +01001345 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001346 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001347 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001348
Gilles Peskine449bd832023-01-11 14:50:10 +01001349 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1350 if (ret != 0) {
1351 return ret;
1352 }
Simon Butcher584a5472016-05-23 16:24:52 +01001353 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001354#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001355 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001356 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001357
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001358#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001359 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001360 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001361
Gilles Peskine449bd832023-01-11 14:50:10 +01001362 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1363 if (ret != 0) {
1364 return ret;
1365 }
Simon Butcher584a5472016-05-23 16:24:52 +01001366 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001367#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1368
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001369#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001370 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001371 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001372
Gilles Peskine449bd832023-01-11 14:50:10 +01001373 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1374 if (ret != 0) {
1375 return ret;
1376 }
Simon Butcher584a5472016-05-23 16:24:52 +01001377 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001378#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001379
Hanno Beckera0e20d02019-05-15 14:03:01 +01001380#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001381 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001382 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001383
Gilles Peskine449bd832023-01-11 14:50:10 +01001384 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1385 if (ret != 0) {
1386 return ret;
1387 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001388 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001389#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001390
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001391#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001392 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001393 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001394
Gilles Peskine449bd832023-01-11 14:50:10 +01001395 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1396 if (ret != 0) {
1397 return ret;
1398 }
Simon Butcher584a5472016-05-23 16:24:52 +01001399 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001400#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001401
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001402#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001403 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001404 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001405
Gilles Peskine449bd832023-01-11 14:50:10 +01001406 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1407 if (ret != 0) {
1408 return ret;
1409 }
Simon Butcher584a5472016-05-23 16:24:52 +01001410 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001411#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001413#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001414 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001415 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001416
Gilles Peskine449bd832023-01-11 14:50:10 +01001417 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1418 if (ret != 0) {
1419 return ret;
1420 }
Simon Butcher584a5472016-05-23 16:24:52 +01001421 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001422#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001423
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001424#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001425 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001426 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001427
Gilles Peskine449bd832023-01-11 14:50:10 +01001428 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1429 ext + 4 + ext_size);
1430 if (ret != 0) {
1431 return ret;
1432 }
Simon Butcher584a5472016-05-23 16:24:52 +01001433 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001434#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001435
Johan Pascalb62bb512015-12-03 21:56:45 +01001436#if defined(MBEDTLS_SSL_DTLS_SRTP)
1437 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001438 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001439
Gilles Peskine449bd832023-01-11 14:50:10 +01001440 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1441 if (ret != 0) {
1442 return ret;
1443 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001444 break;
1445#endif /* MBEDTLS_SSL_DTLS_SRTP */
1446
Simon Butcher584a5472016-05-23 16:24:52 +01001447 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001448 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1449 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001450 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001451
Gilles Peskine449bd832023-01-11 14:50:10 +01001452 ext_len -= 4 + ext_size;
1453 ext += 4 + ext_size;
1454 }
1455
Jerry Yue7541932022-01-28 10:21:24 +08001456#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001457
1458 /*
1459 * Try to fall back to default hash SHA1 if the client
1460 * hasn't provided any preferred signature-hash combinations.
1461 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001462 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001463 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1464 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001465#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001466 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1467 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001468#endif
1469#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001470 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1471 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001472#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001473 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001474 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001475
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001476 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1477 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1478 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001479
Gilles Peskine449bd832023-01-11 14:50:10 +01001480 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001481 }
1482
Jerry Yue7541932022-01-28 10:21:24 +08001483#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001484
Paul Bakker48916f92012-09-16 19:57:18 +00001485 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001486 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1487 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001488 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1489 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1490 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001491#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001492 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1493 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1494 "during renegotiation"));
1495 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1496 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1497 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001498 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001499#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001500 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001501 break;
1502 }
1503 }
1504
1505 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001506 * Renegotiation security checks
1507 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001508 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1509 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1510 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001511 handshake_failure = 1;
1512 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001513#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001514 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001515 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001516 renegotiation_info_seen == 0) {
1517 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001518 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001519 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1520 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1521 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1522 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001523 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001524 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1525 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1526 renegotiation_info_seen == 1) {
1527 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001528 handshake_failure = 1;
1529 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001530#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001531
Gilles Peskine449bd832023-01-11 14:50:10 +01001532 if (handshake_failure == 1) {
1533 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1534 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1535 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001536 }
Paul Bakker380da532012-04-18 16:10:25 +00001537
Paul Bakker41c83d32013-03-20 14:39:14 +01001538 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001539 * Server certification selection (after processing TLS extensions)
1540 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001541 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1542 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1543 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001544 }
Glenn Strauss69894072022-01-24 12:58:00 -05001545#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1546 ssl->handshake->sni_name = NULL;
1547 ssl->handshake->sni_name_len = 0;
1548#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001549
1550 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001551 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001552 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001553 * and certificate from the SNI callback triggered by the SNI extension
1554 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001555 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001556 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001557 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001558 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001559
Gilles Peskine449bd832023-01-11 14:50:10 +01001560 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1561 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1562 for (i = 0; ciphersuites[i] != 0; i++) {
1563 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001564 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001565 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001566
TRodziewicz8476f2f2021-06-02 14:34:47 +02001567 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001568
Gilles Peskine449bd832023-01-11 14:50:10 +01001569 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1570 &ciphersuite_info)) != 0) {
1571 return ret;
1572 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001573
Gilles Peskine449bd832023-01-11 14:50:10 +01001574 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001575 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001576 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001577 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001578 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001579 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001580 for (i = 0; ciphersuites[i] != 0; i++) {
1581 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
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 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001585
1586 got_common_suite = 1;
1587
Gilles Peskine449bd832023-01-11 14:50:10 +01001588 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1589 &ciphersuite_info)) != 0) {
1590 return ret;
1591 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001592
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 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001599
Gilles Peskine449bd832023-01-11 14:50:10 +01001600 if (got_common_suite) {
1601 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1602 "but none of them usable"));
1603 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1604 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1605 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1606 } else {
1607 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1608 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1609 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1610 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001611 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001612
1613have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001614 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001615
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001616 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001617 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001618
Paul Bakker5121ce52009-01-03 21:22:43 +00001619 ssl->state++;
1620
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001621#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001622 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1623 mbedtls_ssl_recv_flight_completed(ssl);
1624 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001625#endif
1626
Hanno Becker7e5437a2017-04-28 17:15:26 +01001627 /* Debugging-only output for testsuite */
1628#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001629 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001630 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1631 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001632 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001633 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1634 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1635 sig_hash));
1636 } else {
1637 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1638 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001639 }
1640#endif
1641
Gilles Peskine449bd832023-01-11 14:50:10 +01001642 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001643
Gilles Peskine449bd832023-01-11 14:50:10 +01001644 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001645}
1646
Hanno Beckera0e20d02019-05-15 14:03:01 +01001647#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001648static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1649 unsigned char *buf,
1650 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001651{
1652 unsigned char *p = buf;
1653 size_t ext_len;
1654 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1655
1656 *olen = 0;
1657
1658 /* Skip writing the extension if we don't want to use it or if
1659 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001660 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001661 return;
1662 }
1663
Gilles Peskine449bd832023-01-11 14:50:10 +01001664 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1665 * which is at most 255, so the increment cannot overflow. */
1666 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1667 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1668 return;
1669 }
1670
1671 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001672
1673 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001674 * struct {
1675 * opaque cid<0..2^8-1>;
1676 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001677 */
1678 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001679 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001680 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001681 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001682 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001683
1684 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001685 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001686
1687 *olen = ssl->own_cid_len + 5;
1688}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001689#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001690
Neil Armstrong76b74072022-04-06 13:43:54 +02001691#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001692static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1693 unsigned char *buf,
1694 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001695{
1696 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001697 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001698
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001699 /*
1700 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1701 * from a client and then selects a stream or Authenticated Encryption
1702 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1703 * encrypt-then-MAC response extension back to the client."
1704 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001705 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001706 ssl->session_negotiate->ciphersuite);
1707 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001708 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001709 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001710 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001711 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001712 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001713 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001714
Gilles Peskine449bd832023-01-11 14:50:10 +01001715 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001716 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001717 }
Ronald Cron862902d2022-03-24 14:15:28 +01001718 }
1719
Gilles Peskine449bd832023-01-11 14:50:10 +01001720 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001721 *olen = 0;
1722 return;
1723 }
1724
Gilles Peskine449bd832023-01-11 14:50:10 +01001725 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001726
Gilles Peskine449bd832023-01-11 14:50:10 +01001727 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001728 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001729
1730 *p++ = 0x00;
1731 *p++ = 0x00;
1732
1733 *olen = 4;
1734}
Neil Armstrong76b74072022-04-06 13:43:54 +02001735#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001736
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001737#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001738static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1739 unsigned char *buf,
1740 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001741{
1742 unsigned char *p = buf;
1743
Gilles Peskine449bd832023-01-11 14:50:10 +01001744 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001745 *olen = 0;
1746 return;
1747 }
1748
Gilles Peskine449bd832023-01-11 14:50:10 +01001749 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1750 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001751
Gilles Peskine449bd832023-01-11 14:50:10 +01001752 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001753 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001754
1755 *p++ = 0x00;
1756 *p++ = 0x00;
1757
1758 *olen = 4;
1759}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001760#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001761
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001762#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001763static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1764 unsigned char *buf,
1765 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001766{
1767 unsigned char *p = buf;
1768
Gilles Peskine449bd832023-01-11 14:50:10 +01001769 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001770 *olen = 0;
1771 return;
1772 }
1773
Gilles Peskine449bd832023-01-11 14:50:10 +01001774 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001775
Gilles Peskine449bd832023-01-11 14:50:10 +01001776 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001777 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001778
1779 *p++ = 0x00;
1780 *p++ = 0x00;
1781
1782 *olen = 4;
1783}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001784#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001785
Gilles Peskine449bd832023-01-11 14:50:10 +01001786static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1787 unsigned char *buf,
1788 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001789{
1790 unsigned char *p = buf;
1791
Gilles Peskine449bd832023-01-11 14:50:10 +01001792 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001793 *olen = 0;
1794 return;
1795 }
1796
Gilles Peskine449bd832023-01-11 14:50:10 +01001797 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001798
Gilles Peskine449bd832023-01-11 14:50:10 +01001799 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001800 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001801
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001802#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001803 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001804 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001805 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001806 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001807
Gilles Peskine449bd832023-01-11 14:50:10 +01001808 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001809 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001810 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001811 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001812 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001813#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001814 {
1815 *p++ = 0x00;
1816 *p++ = 0x01;
1817 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001818 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001819
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001820 *olen = (size_t) (p - buf);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001821}
1822
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001823#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001824static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1825 unsigned char *buf,
1826 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001827{
1828 unsigned char *p = buf;
1829
Gilles Peskine449bd832023-01-11 14:50:10 +01001830 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001831 *olen = 0;
1832 return;
1833 }
1834
Gilles Peskine449bd832023-01-11 14:50:10 +01001835 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001836
Gilles Peskine449bd832023-01-11 14:50:10 +01001837 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001838 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001839
1840 *p++ = 0x00;
1841 *p++ = 1;
1842
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001843 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001844
1845 *olen = 5;
1846}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001847#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001848
Valerio Setti7aeec542023-07-05 18:57:21 +02001849#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001850 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001851 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001852static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1853 unsigned char *buf,
1854 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001855{
1856 unsigned char *p = buf;
1857 ((void) ssl);
1858
Gilles Peskine449bd832023-01-11 14:50:10 +01001859 if ((ssl->handshake->cli_exts &
1860 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001861 *olen = 0;
1862 return;
1863 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001864
Gilles Peskine449bd832023-01-11 14:50:10 +01001865 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001866
Gilles Peskine449bd832023-01-11 14:50:10 +01001867 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001868 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001869
1870 *p++ = 0x00;
1871 *p++ = 2;
1872
1873 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001874 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001875
1876 *olen = 6;
1877}
Valerio Setti45d56f32023-07-13 17:23:20 +02001878#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001879 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001880 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001881
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001882#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001883static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1884 unsigned char *buf,
1885 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001886{
Janos Follath865b3eb2019-12-16 11:46:15 +00001887 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001888 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001889 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001890 size_t kkpp_len;
1891
1892 *olen = 0;
1893
1894 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001895 if (ssl->handshake->ciphersuite_info->key_exchange !=
1896 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001897 return;
1898 }
1899
Gilles Peskine449bd832023-01-11 14:50:10 +01001900 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1901
1902 if (end - p < 4) {
1903 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1904 return;
1905 }
1906
1907 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001908 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001909
Gilles Peskine449bd832023-01-11 14:50:10 +01001910 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00001911 p + 2, (size_t) (end - p - 2), &kkpp_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001912 MBEDTLS_ECJPAKE_ROUND_ONE);
1913 if (ret != 0) {
1914 psa_destroy_key(ssl->handshake->psa_pake_password);
1915 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1916 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001917 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001918 }
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001919
Gilles Peskine449bd832023-01-11 14:50:10 +01001920 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001921 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001922
1923 *olen = kkpp_len + 4;
1924}
1925#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1926
Gilles Peskine449bd832023-01-11 14:50:10 +01001927#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1928static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1929 unsigned char *buf,
1930 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001931{
Ron Eldor75870ec2018-12-06 17:31:55 +02001932 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001933 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001934 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1935
1936 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001937
Gilles Peskine449bd832023-01-11 14:50:10 +01001938 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1939 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001940 return;
1941 }
1942
Gilles Peskine449bd832023-01-11 14:50:10 +01001943 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001944
Gilles Peskine449bd832023-01-11 14:50:10 +01001945 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001946 mki_len = ssl->dtls_srtp_info.mki_len;
1947 }
1948
Johan Pascal9bc97ca2020-09-21 23:44:45 +02001949 /* The extension total size is 9 bytes :
1950 * - 2 bytes for the extension tag
1951 * - 2 bytes for the total size
1952 * - 2 bytes for the protection profile length
1953 * - 2 bytes for the protection profile
1954 * - 1 byte for the mki length
1955 * + the actual mki length
1956 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01001957 if ((size_t) (end - buf) < mki_len + 9) {
1958 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02001959 return;
1960 }
1961
Johan Pascalb62bb512015-12-03 21:56:45 +01001962 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01001963 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03001964 /*
1965 * total length 5 and mki value: only one profile(2 bytes)
1966 * and length(2 bytes) and srtp_mki )
1967 */
Ron Eldor591f1622018-01-22 12:30:04 +02001968 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001969 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01001970
1971 /* protection profile length: 2 */
1972 buf[4] = 0x00;
1973 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02001974 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01001975 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
1976 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
1977 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
1978 } else {
1979 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02001980 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01001981 }
1982
Ron Eldor591f1622018-01-22 12:30:04 +02001983 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01001984 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01001985
Ron Eldor591f1622018-01-22 12:30:04 +02001986 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01001987}
1988#endif /* MBEDTLS_SSL_DTLS_SRTP */
1989
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001990#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001991MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001992static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001993{
Janos Follath865b3eb2019-12-16 11:46:15 +00001994 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001995 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02001996 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001997
Gilles Peskine449bd832023-01-11 14:50:10 +01001998 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001999
2000 /*
2001 * struct {
2002 * ProtocolVersion server_version;
2003 * opaque cookie<0..2^8-1>;
2004 * } HelloVerifyRequest;
2005 */
2006
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002007 /* The RFC is not clear on this point, but sending the actual negotiated
2008 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002009 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2010 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002011 p += 2;
2012
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002013 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002014 if (ssl->conf->f_cookie_write == NULL) {
2015 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2016 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002017 }
2018
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002019 /* Skip length byte until we know the length */
2020 cookie_len_byte = p++;
2021
Gilles Peskine449bd832023-01-11 14:50:10 +01002022 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2023 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2024 ssl->cli_id, ssl->cli_id_len)) != 0) {
2025 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2026 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002027 }
2028
Gilles Peskine449bd832023-01-11 14:50:10 +01002029 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002030
Gilles Peskine449bd832023-01-11 14:50:10 +01002031 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002032
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002033 ssl->out_msglen = (size_t) (p - ssl->out_msg);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002034 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2035 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002036
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002037 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002038
Gilles Peskine449bd832023-01-11 14:50:10 +01002039 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2040 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2041 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002042 }
2043
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002044#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002045 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2046 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2047 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2048 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002049 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002050#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002051
Gilles Peskine449bd832023-01-11 14:50:10 +01002052 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002053
Gilles Peskine449bd832023-01-11 14:50:10 +01002054 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002055}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002056#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002057
Gilles Peskine449bd832023-01-11 14:50:10 +01002058static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002059{
2060 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002061 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002062 mbedtls_ssl_session * const session = ssl->session_negotiate;
2063
2064 /* Resume is 0 by default, see ssl_handshake_init().
2065 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002066 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002067 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002068 }
2069 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002070 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002071 }
2072 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002073 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002074 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002075#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002076 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002077 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002078 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002079#endif
2080
Gilles Peskine449bd832023-01-11 14:50:10 +01002081 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002082
Gilles Peskine449bd832023-01-11 14:50:10 +01002083 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2084 session->id,
2085 session->id_len,
2086 &session_tmp);
2087 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002088 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002089 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002090
Gilles Peskine449bd832023-01-11 14:50:10 +01002091 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002092 /* Mismatch between cached and negotiated session */
2093 goto exit;
2094 }
2095
2096 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002097 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002098 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002099 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002100
Gilles Peskine449bd832023-01-11 14:50:10 +01002101 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002102 ssl->handshake->resume = 1;
2103
2104exit:
2105
Gilles Peskine449bd832023-01-11 14:50:10 +01002106 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002107}
2108
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002109MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002110static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002111{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002112#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002113 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002114#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002115 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002116 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002117 unsigned char *buf, *p;
2118
Gilles Peskine449bd832023-01-11 14:50:10 +01002119 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002120
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002121#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002122 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2123 ssl->handshake->cookie_verify_result != 0) {
2124 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2125 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002126
Gilles Peskine449bd832023-01-11 14:50:10 +01002127 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002128 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002129#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002130
Paul Bakker5121ce52009-01-03 21:22:43 +00002131 /*
2132 * 0 . 0 handshake type
2133 * 1 . 3 handshake length
2134 * 4 . 5 protocol version
2135 * 6 . 9 UNIX time()
2136 * 10 . 37 random bytes
2137 */
2138 buf = ssl->out_msg;
2139 p = buf + 4;
2140
Gilles Peskine449bd832023-01-11 14:50:10 +01002141 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002142 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002143
Gilles Peskine449bd832023-01-11 14:50:10 +01002144 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2145 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002146
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002147#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002148 t = mbedtls_time(NULL);
2149 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002150 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002151
Gilles Peskine449bd832023-01-11 14:50:10 +01002152 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2153 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002154#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002155 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2156 return ret;
2157 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002158
2159 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002160#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002161
Ronald Cronc5649382023-04-04 15:33:42 +02002162 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002163 return ret;
2164 }
Ronald Cronc5649382023-04-04 15:33:42 +02002165 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002166
Ronald Cronc5649382023-04-04 15:33:42 +02002167#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2168 /*
2169 * RFC 8446
2170 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2171 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2172 * response to a ClientHello MUST set the last 8 bytes of their Random
2173 * value specially in their ServerHello.
2174 */
2175 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2176 static const unsigned char magic_tls12_downgrade_string[] =
2177 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2178
2179 MBEDTLS_STATIC_ASSERT(
2180 sizeof(magic_tls12_downgrade_string) == 8,
2181 "magic_tls12_downgrade_string does not have the expected size");
2182
Ronald Cronfe01ec22023-04-06 09:56:53 +02002183 memcpy(p, magic_tls12_downgrade_string,
2184 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002185 } else
2186#endif
2187 {
2188 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2189 return ret;
2190 }
2191 }
2192 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002193
Gilles Peskine449bd832023-01-11 14:50:10 +01002194 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002195
Gilles Peskine449bd832023-01-11 14:50:10 +01002196 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002197
Gilles Peskine449bd832023-01-11 14:50:10 +01002198 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002199
Gilles Peskine449bd832023-01-11 14:50:10 +01002200 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002201 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002202 * New session, create a new session id,
2203 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002204 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002205 ssl->state++;
2206
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002207#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002208 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002209#endif
2210
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002211#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002212 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002213 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002214 memset(ssl->session_negotiate->id, 0, 32);
2215 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002216#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002217 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002218 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002219 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2220 n)) != 0) {
2221 return ret;
2222 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002223 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002224 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002225 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002226 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002227 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002228 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002229 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002230
Gilles Peskine449bd832023-01-11 14:50:10 +01002231 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2232 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2233 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002234 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002235 }
2236
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002237 /*
2238 * 38 . 38 session id length
2239 * 39 . 38+n session id
2240 * 39+n . 40+n chosen ciphersuite
2241 * 41+n . 41+n chosen compression alg.
2242 * 42+n . 43+n extensions length
2243 * 44+n . 43+n+m extensions
2244 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002245 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002246 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002247 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002248
Gilles Peskine449bd832023-01-11 14:50:10 +01002249 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2250 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2251 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2252 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002253
Gilles Peskine449bd832023-01-11 14:50:10 +01002254 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002255 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002256 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002257
Gilles Peskine449bd832023-01-11 14:50:10 +01002258 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2259 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2260 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2261 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002262
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002263 /*
2264 * First write extensions, then the total length
2265 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002266 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002267 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002268
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002269#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002270 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002271 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002272#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002273
Hanno Beckera0e20d02019-05-15 14:03:01 +01002274#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002275 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002276 ext_len += olen;
2277#endif
2278
Neil Armstrong76b74072022-04-06 13:43:54 +02002279#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002280 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002281 ext_len += olen;
2282#endif
2283
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002284#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002285 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002286 ext_len += olen;
2287#endif
2288
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002289#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002290 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002291 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002292#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002293
Valerio Setti7aeec542023-07-05 18:57:21 +02002294#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002295 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002296 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002297 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002298 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2299 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2300 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002301 ext_len += olen;
2302 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002303#endif
2304
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002305#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002306 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002307 ext_len += olen;
2308#endif
2309
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002310#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002311 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002312 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2313 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002314 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002315 }
Paul Elliottf518f812022-07-11 12:36:20 +01002316
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002317 ext_len += olen;
2318#endif
2319
Johan Pascalb62bb512015-12-03 21:56:45 +01002320#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002321 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002322 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002323#endif
2324
Gilles Peskine449bd832023-01-11 14:50:10 +01002325 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2326 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002327
Gilles Peskine449bd832023-01-11 14:50:10 +01002328 if (ext_len > 0) {
2329 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002330 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002331 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002332
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002333 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002334 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2335 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002336
Gilles Peskine449bd832023-01-11 14:50:10 +01002337 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002338
Gilles Peskine449bd832023-01-11 14:50:10 +01002339 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002340
Gilles Peskine449bd832023-01-11 14:50:10 +01002341 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002342}
2343
Gilles Peskineeccd8882020-03-10 12:19:08 +01002344#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002345MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002346static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002347{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002348 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002349 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002350
Gilles Peskine449bd832023-01-11 14:50:10 +01002351 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002352
Gilles Peskine449bd832023-01-11 14:50:10 +01002353 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2354 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002355 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002356 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002357 }
2358
Gilles Peskine449bd832023-01-11 14:50:10 +01002359 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2360 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002361}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002362#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002363MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002364static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002365{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002366 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002367 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002368 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002369 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002370 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002371 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002372 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002373 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002374 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002375
Gilles Peskine449bd832023-01-11 14:50:10 +01002376 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002377
2378 ssl->state++;
2379
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002380#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002381 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002382 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002383 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002384#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002385 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002386
Gilles Peskine449bd832023-01-11 14:50:10 +01002387 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2388 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2389 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2390 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002391 }
2392
2393 /*
2394 * 0 . 0 handshake type
2395 * 1 . 3 handshake length
2396 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002397 * 5 .. m-1 cert types
2398 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002399 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002400 * n .. n+1 length of all DNs
2401 * n+2 .. n+3 length of DN 1
2402 * n+4 .. ... Distinguished Name #1
2403 * ... .. ... length of DN 2, etc.
2404 */
2405 buf = ssl->out_msg;
2406 p = buf + 4;
2407
2408 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002409 * Supported certificate types
2410 *
2411 * ClientCertificateType certificate_types<1..2^8-1>;
2412 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002413 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002414 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002415
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002416#if defined(MBEDTLS_RSA_C)
2417 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002418#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002419#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002420 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002421#endif
2422
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002423 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002424 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002425
Paul Bakker577e0062013-08-28 11:57:20 +02002426 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002427
Paul Bakker926af752012-11-23 13:38:07 +01002428 /*
2429 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002430 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002431 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2432 *
2433 * struct {
2434 * HashAlgorithm hash;
2435 * SignatureAlgorithm signature;
2436 * } SignatureAndHashAlgorithm;
2437 *
2438 * enum { (255) } HashAlgorithm;
2439 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002440 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002441 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2442 if (sig_alg == NULL) {
2443 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2444 }
Ronald Cron8457c122022-03-07 11:32:54 +01002445
Gilles Peskine449bd832023-01-11 14:50:10 +01002446 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2447 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002448
Gilles Peskine449bd832023-01-11 14:50:10 +01002449 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002450 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002451 }
2452 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002453 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002454 }
Simon Butcher99000142016-10-13 17:21:01 +01002455
Paul Elliott96a0fd92022-11-08 17:09:56 +00002456 /* Write elements at offsets starting from 1 (offset 0 is for the
2457 * length). Thus the offset of each element is the length of the
2458 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002459 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002460 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002461
Paul Bakker926af752012-11-23 13:38:07 +01002462 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002463
Paul Elliott96a0fd92022-11-08 17:09:56 +00002464 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002465 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002466 sa_len += 2;
2467 p += sa_len;
2468
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002469 /*
2470 * DistinguishedName certificate_authorities<0..2^16-1>;
2471 * opaque DistinguishedName<1..2^16-1>;
2472 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002473 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002474
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002475 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002476
Gilles Peskine449bd832023-01-11 14:50:10 +01002477 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002478 /* NOTE: If trusted certificates are provisioned
2479 * via a CA callback (configured through
2480 * `mbedtls_ssl_conf_ca_cb()`, then the
2481 * CertificateRequest is currently left empty. */
2482
Glenn Strauss999ef702022-03-11 01:37:23 -05002483#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2484#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002485 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002486 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002487 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002488#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002489 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002490 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002491 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002492#endif
Janos Follath088ce432017-04-10 12:42:31 +01002493#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002494 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002495 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002496 } else
Janos Follath088ce432017-04-10 12:42:31 +01002497#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002498 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002499
Gilles Peskine449bd832023-01-11 14:50:10 +01002500 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002501 /* It follows from RFC 5280 A.1 that this length
2502 * can be represented in at most 11 bits. */
2503 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002504
Gilles Peskine449bd832023-01-11 14:50:10 +01002505 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2506 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002507 break;
2508 }
2509
Gilles Peskine449bd832023-01-11 14:50:10 +01002510 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002511 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002512 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002513 p += dn_size;
2514
Gilles Peskine449bd832023-01-11 14:50:10 +01002515 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002516
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002517 total_dn_size += (unsigned short) (2 + dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002518 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002519 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002520 }
2521
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002522 ssl->out_msglen = (size_t) (p - buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002523 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2524 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002525 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002526
Gilles Peskine449bd832023-01-11 14:50:10 +01002527 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002528
Gilles Peskine449bd832023-01-11 14:50:10 +01002529 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002530
Gilles Peskine449bd832023-01-11 14:50:10 +01002531 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002532}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002533#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002534
Valerio Setti4d0e8462023-10-06 13:20:21 +02002535#if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01002536 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002537MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002538static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002539{
2540 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2541 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002542 mbedtls_pk_context *pk;
2543 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002544 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Settibced8bc2023-12-06 10:40:47 +01002545 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
2546 size_t key_len;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002547#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002548 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002549 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti97207782023-05-18 18:59:06 +02002550 mbedtls_ecp_group_id grp_id;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002551 mbedtls_ecp_keypair *key;
2552#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002553
Gilles Peskine449bd832023-01-11 14:50:10 +01002554 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002555
Gilles Peskine449bd832023-01-11 14:50:10 +01002556 if (pk == NULL) {
2557 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2558 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002559
Valerio Setti0813b6f2023-06-16 12:18:53 +02002560 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002561
Valerio Setti0813b6f2023-06-16 12:18:53 +02002562 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002563 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002564#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2565 case MBEDTLS_PK_ECKEY:
2566 case MBEDTLS_PK_ECKEY_DH:
2567 case MBEDTLS_PK_ECDSA:
2568#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002569 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2570 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2571 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002572
Valerio Settibced8bc2023-12-06 10:40:47 +01002573 /* Get the attributes of the key previously parsed by PK module in
2574 * order to extract its type and length (in bits). */
2575 status = psa_get_key_attributes(pk->priv_id, &key_attributes);
Gilles Peskine449bd832023-01-11 14:50:10 +01002576 if (status != PSA_SUCCESS) {
Valerio Settibced8bc2023-12-06 10:40:47 +01002577 ret = PSA_TO_MBEDTLS_ERR(status);
2578 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002579 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002580 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002581 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002582
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002583#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2584 if (pk_type != MBEDTLS_PK_OPAQUE) {
Valerio Setti202bb712023-12-06 17:05:24 +01002585 /* PK_ECKEY[_DH] and PK_ECDSA instead as parsed from the PK
2586 * module and only have ECDSA capabilities. Since we need
2587 * them for ECDH later, we export and then re-import them with
2588 * proper flags and algorithm. Of course We also set key's type
2589 * and bits that we just got above. */
2590 key_attributes = psa_key_attributes_init();
2591 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2592 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2593 psa_set_key_type(&key_attributes,
2594 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2595 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Valerio Settibced8bc2023-12-06 10:40:47 +01002596
Valerio Setti202bb712023-12-06 17:05:24 +01002597 status = psa_export_key(pk->priv_id, buf, sizeof(buf), &key_len);
2598 if (status != PSA_SUCCESS) {
2599 ret = PSA_TO_MBEDTLS_ERR(status);
2600 goto exit;
2601 }
2602 status = psa_import_key(&key_attributes, buf, key_len,
2603 &ssl->handshake->xxdh_psa_privkey);
2604 if (status != PSA_SUCCESS) {
2605 ret = PSA_TO_MBEDTLS_ERR(status);
2606 goto exit;
2607 }
Valerio Settibced8bc2023-12-06 10:40:47 +01002608
Valerio Setti202bb712023-12-06 17:05:24 +01002609 /* Set this key as owned by the TLS library: it will be its duty
2610 * to clear it exit. */
2611 ssl->handshake->xxdh_psa_privkey_is_external = 0;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002612
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002613 ret = 0;
2614 break;
2615 }
2616#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
2617
2618 /* Opaque key is created by the user (externally from Mbed TLS)
2619 * so we assume it already has the right algorithm and flags
2620 * set. Just copy its ID as reference. */
2621 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
2622 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01002623 ret = 0;
2624 break;
Gilles Peskinec6d2df82023-12-18 20:38:38 +01002625
Valerio Setti0813b6f2023-06-16 12:18:53 +02002626#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002627 case MBEDTLS_PK_ECKEY:
2628 case MBEDTLS_PK_ECKEY_DH:
2629 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002630 key = mbedtls_pk_ec_rw(*pk);
Valerio Settif9362b72023-11-29 08:42:27 +01002631 grp_id = mbedtls_pk_get_ec_group_id(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002632 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002633 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2634 }
Valerio Setti97207782023-05-18 18:59:06 +02002635 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002636 if (tls_id == 0) {
2637 /* This elliptic curve is not supported */
2638 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2639 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002640
Gilles Peskine449bd832023-01-11 14:50:10 +01002641 /* If the above conversion to TLS ID was fine, then also this one will
2642 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002643 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002644 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002645
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002646 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002647
Gilles Peskine449bd832023-01-11 14:50:10 +01002648 key_attributes = psa_key_attributes_init();
2649 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2650 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2651 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002652 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002653 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002654
Gilles Peskine84b9f1b2024-02-19 16:44:29 +01002655 ret = mbedtls_ecp_write_key_ext(key, &key_len, buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002656 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002657 mbedtls_platform_zeroize(buf, sizeof(buf));
2658 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002659 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002660
Gilles Peskine449bd832023-01-11 14:50:10 +01002661 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002662 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002663 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002664 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002665 mbedtls_platform_zeroize(buf, sizeof(buf));
2666 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002667 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002668
Valerio Setti6835b4a2023-06-22 09:06:31 +02002669 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002670 ret = 0;
2671 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002672#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002673 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002674 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002675 }
2676
Valerio Settibced8bc2023-12-06 10:40:47 +01002677exit:
2678 psa_reset_key_attributes(&key_attributes);
2679 mbedtls_platform_zeroize(buf, sizeof(buf));
2680
Gilles Peskine449bd832023-01-11 14:50:10 +01002681 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002682}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002683#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2684 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002685
Gilles Peskineeccd8882020-03-10 12:19:08 +01002686#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002687 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002688MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002689static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2690 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002691{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002692 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2693 * signature length which will be added in ssl_write_server_key_exchange
2694 * after the call to ssl_prepare_server_key_exchange.
2695 * ssl_write_server_key_exchange also takes care of incrementing
2696 * ssl->out_msglen. */
2697 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002698 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2699 - sig_start);
2700 int ret = ssl->conf->f_async_resume(ssl,
2701 sig_start, signature_len, sig_max_len);
2702 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002703 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002704 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002705 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002706 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2707 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002708}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002709#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002710 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002711
Gilles Peskined3eb0612018-01-08 17:07:44 +01002712/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002713 * calculating the signature if any, but excluding formatting the
2714 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002715MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002716static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2717 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002718{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002719 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002720 ssl->handshake->ciphersuite_info;
2721
Gilles Peskineeccd8882020-03-10 12:19:08 +01002722#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002723#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002724 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002725#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002726#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002727
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002728 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002729#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002730 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002731#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002732
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002733#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002734#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002735 size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002736#else
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00002737 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 +02002738#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002739#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002740
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002741 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002742
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002743 /*
2744 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002745 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002746 *
2747 */
2748
2749 /*
2750 * - ECJPAKE key exchanges
2751 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002752#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002753 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002754 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002755 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2756 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2757 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002758 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002759 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002760
Valerio Setti6f1b5742022-11-16 10:00:32 +01002761 /*
2762 * The first 3 bytes are:
2763 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2764 * [1, 2] elliptic curve's TLS ID
2765 *
2766 * However since we only support secp256r1 for now, we hardcode its
2767 * TLS ID here
2768 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002769 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002770 MBEDTLS_ECP_DP_SECP256R1);
2771 if (tls_id == 0) {
2772 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002773 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002774 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002775 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002776 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002777
Gilles Peskine449bd832023-01-11 14:50:10 +01002778 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2779 out_p + output_offset,
2780 end_p - out_p - output_offset, &output_len,
2781 MBEDTLS_ECJPAKE_ROUND_TWO);
2782 if (ret != 0) {
2783 psa_destroy_key(ssl->handshake->psa_pake_password);
2784 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2785 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2786 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002787 }
2788
Valerio Setti02c25b52022-11-15 14:08:42 +01002789 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002790 ssl->out_msglen += output_offset;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002791 }
2792#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2793
Hanno Becker1aa267c2017-04-28 17:08:27 +01002794 /*
Valerio Setti48659a12025-01-15 14:22:28 +01002795 * For ECDHE key exchanges with PSK, parameters are prefixed by support
Hanno Becker1aa267c2017-04-28 17:08:27 +01002796 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2797 * we use empty support identity hints here.
2798 **/
Valerio Setti48659a12025-01-15 14:22:28 +01002799#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2800 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002801 ssl->out_msg[ssl->out_msglen++] = 0x00;
2802 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002803 }
Valerio Setti48659a12025-01-15 14:22:28 +01002804#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002805
Hanno Becker7e5437a2017-04-28 17:15:26 +01002806 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002807 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002808 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002809#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002810 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002811 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002812 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002813
Gilles Peskine449bd832023-01-11 14:50:10 +01002814 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2815 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2816 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002817 }
2818
Paul Bakker41c83d32013-03-20 14:39:14 +01002819 /*
2820 * Ephemeral DH parameters:
2821 *
2822 * struct {
2823 * opaque dh_p<1..2^16-1>;
2824 * opaque dh_g<1..2^16-1>;
2825 * opaque dh_Ys<1..2^16-1>;
2826 * } ServerDHParams;
2827 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002828 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2829 &ssl->conf->dhm_P,
2830 &ssl->conf->dhm_G)) != 0) {
2831 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2832 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002833 }
Paul Bakker48916f92012-09-16 19:57:18 +00002834
Gilles Peskine449bd832023-01-11 14:50:10 +01002835 if ((ret = mbedtls_dhm_make_params(
2836 &ssl->handshake->dhm_ctx,
2837 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2838 ssl->out_msg + ssl->out_msglen, &len,
2839 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2840 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2841 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002842 }
2843
Jerry Yuc5aef882021-12-23 20:15:02 +08002844#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002845 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002846#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002847
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002848 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002849
Gilles Peskine449bd832023-01-11 14:50:10 +01002850 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2851 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2852 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2853 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002854 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002855#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002856
Hanno Becker1aa267c2017-04-28 17:08:27 +01002857 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002858 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002859 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002860#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002861 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002862 /*
2863 * Ephemeral ECDH parameters:
2864 *
2865 * struct {
2866 * ECParameters curve_params;
2867 * ECPoint public;
2868 * } ServerECDHParams;
2869 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002870 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Manuel Pégourié-Gonnard6402c352025-01-14 12:23:56 +01002871 const uint16_t *group_list = ssl->conf->group_list;
Janos Follath865b3eb2019-12-16 11:46:15 +00002872 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002873 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002874
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002875 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002876 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2877 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2878 }
2879 for (; *group_list != 0; group_list++) {
2880 for (curr_tls_id = ssl->handshake->curves_tls_id;
2881 *curr_tls_id != 0; curr_tls_id++) {
2882 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002883 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002884 }
2885 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002886 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002887
Gilles Peskine449bd832023-01-11 14:50:10 +01002888curve_matching_done:
2889 if (*curr_tls_id == 0) {
2890 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2891 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2892 }
2893
2894 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2895 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002896
Neil Armstrongd91526c2022-04-12 14:38:52 +02002897 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2898 psa_key_attributes_t key_attributes;
2899 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002900 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2901 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2902 // data length(1)
2903 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002904 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002905 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002906
Gilles Peskine449bd832023-01-11 14:50:10 +01002907 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002908
Valerio Setti40d9ca92023-01-04 16:08:04 +01002909 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002910 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002911 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002912 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2913 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2914 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002915 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002916 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02002917 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002918
2919 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002920 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2921 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002922 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02002923 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002924
2925 /*
2926 * ECParameters curve_params
2927 *
2928 * First byte is curve_type, always named_curve
2929 */
2930 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
2931
2932 /*
2933 * Next two bytes are the namedcurve value
2934 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002935 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002936 p += 2;
2937
2938 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002939 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002940 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002941 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002942 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002943 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
2944 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002945 }
2946
2947 /*
2948 * ECPoint public
2949 *
2950 * First byte is data length.
2951 * It will be filled later. p holds now the data length location.
2952 */
2953
2954 /* Export the public part of the ECDH private key from PSA.
2955 * Make one byte space for the length.
2956 */
2957 unsigned char *own_pubkey = p + data_length_size;
2958
Gilles Peskine449bd832023-01-11 14:50:10 +01002959 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
2960 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002961
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002962 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002963 own_pubkey, own_pubkey_max_len,
2964 &len);
2965 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002966 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002967 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002968 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
2969 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01002970 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002971 }
2972
2973 /* Store the length of the exported public key. */
2974 *p = (uint8_t) len;
2975
2976 /* Determine full message length. */
2977 len += header_size;
Paul Bakker41c83d32013-03-20 14:39:14 +01002978
Jerry Yuc5aef882021-12-23 20:15:02 +08002979#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002980 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002981#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002982
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002983 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01002984 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002985#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002986
Hanno Becker1aa267c2017-04-28 17:08:27 +01002987 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002988 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002989 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002990 * exchange parameters, compute and add the signature here.
2991 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01002992 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002993#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002994 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
2995 if (dig_signed == NULL) {
2996 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2997 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01002998 }
2999
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003000 size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
Gilles Peskineca1d7422018-04-24 11:53:22 +02003001 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003002 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003003
Janos Follath865b3eb2019-12-16 11:46:15 +00003004 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003005
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003006 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003007 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003008 * For TLS 1.2, obey signature-hash-algorithm extension
3009 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003010 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003011
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003012 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003013 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003014
Dave Rodgmanc37ad442023-11-03 23:36:06 +00003015 unsigned char sig_hash =
3016 (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003017 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003018
Gilles Peskine449bd832023-01-11 14:50:10 +01003019 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003020
Ronald Cron8457c122022-03-07 11:32:54 +01003021 /* For TLS 1.2, obey signature-hash-algorithm extension
3022 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003023 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3024 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003025 /* (... because we choose a cipher suite
3026 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003027 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003028 }
3029
Gilles Peskine449bd832023-01-11 14:50:10 +01003030 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003031
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003032 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003033 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003034 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003035 if (md_alg != MBEDTLS_MD_NONE) {
3036 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3037 dig_signed,
3038 dig_signed_len,
3039 md_alg);
3040 if (ret != 0) {
3041 return ret;
3042 }
3043 } else {
3044 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3045 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003046 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003047
Gilles Peskine449bd832023-01-11 14:50:10 +01003048 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003049
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003050 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003051 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003052 */
Ronald Cron8457c122022-03-07 11:32:54 +01003053 /*
3054 * We need to specify signature and hash algorithm explicitly through
3055 * a prefix to the signature.
3056 *
3057 * struct {
3058 * HashAlgorithm hash;
3059 * SignatureAlgorithm signature;
3060 * } SignatureAndHashAlgorithm;
3061 *
3062 * struct {
3063 * SignatureAndHashAlgorithm algorithm;
3064 * opaque signature<0..2^16-1>;
3065 * } DigitallySigned;
3066 *
3067 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003068
Gilles Peskine449bd832023-01-11 14:50:10 +01003069 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3070 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003071
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003072#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003073 if (ssl->conf->f_async_sign_start != NULL) {
3074 ret = ssl->conf->f_async_sign_start(ssl,
3075 mbedtls_ssl_own_cert(ssl),
3076 md_alg, hash, hashlen);
3077 switch (ret) {
3078 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3079 /* act as if f_async_sign was null */
3080 break;
3081 case 0:
3082 ssl->handshake->async_in_progress = 1;
3083 return ssl_resume_server_key_exchange(ssl, signature_len);
3084 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3085 ssl->handshake->async_in_progress = 1;
3086 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3087 default:
3088 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3089 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003090 }
3091 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003092#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003093
Gilles Peskine449bd832023-01-11 14:50:10 +01003094 if (mbedtls_ssl_own_key(ssl) == NULL) {
3095 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3096 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003097 }
3098
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003099 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3100 * signature length which will be added in ssl_write_server_key_exchange
3101 * after the call to ssl_prepare_server_key_exchange.
3102 * ssl_write_server_key_exchange also takes care of incrementing
3103 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003104 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3105 md_alg, hash, hashlen,
3106 ssl->out_msg + ssl->out_msglen + 2,
3107 out_buf_len - ssl->out_msglen - 2,
3108 signature_len,
3109 ssl->conf->f_rng,
3110 ssl->conf->p_rng)) != 0) {
3111 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3112 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003113 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003114 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003115#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003116
Gilles Peskine449bd832023-01-11 14:50:10 +01003117 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003118}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003119
Gilles Peskined3eb0612018-01-08 17:07:44 +01003120/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003121 * that do not include a ServerKeyExchange message, do nothing. Either
3122 * way, if successful, move on to the next step in the SSL state
3123 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003124MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003125static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003126{
Janos Follath865b3eb2019-12-16 11:46:15 +00003127 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003128 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003129#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003130 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003131 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003132#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003133
Gilles Peskine449bd832023-01-11 14:50:10 +01003134 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003135
Gilles Peskineeccd8882020-03-10 12:19:08 +01003136#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003137 /* Extract static ECDH parameters and abort if ServerKeyExchange
3138 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003139 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003140 /* For suites involving ECDH, extract DH parameters
3141 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003142#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003143 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3144 ret = ssl_get_ecdh_params_from_cert(ssl);
3145 if (ret != 0) {
3146 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3147 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003148 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003149 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003150#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003151
3152 /* Key exchanges not involving ephemeral keys don't use
3153 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003154 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003155 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003156 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003157 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003158#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003159
Gilles Peskineeccd8882020-03-10 12:19:08 +01003160#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003161 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003162 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003163 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003164 if (ssl->handshake->async_in_progress != 0) {
3165 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3166 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3167 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003168#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003169 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003170 {
3171 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003172 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003173 }
3174
Gilles Peskine449bd832023-01-11 14:50:10 +01003175 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003176 /* If we're starting to write a new message, set ssl->out_msglen
3177 * to 0. But if we're resuming after an asynchronous message,
3178 * out_msglen is the amount of data written so far and mst be
3179 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003180 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3181 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3182 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003183 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003184 }
3185 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003186 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003187
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003188 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003189 * ssl_prepare_server_key_exchange already wrote the signature
3190 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003191#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003192 if (signature_len != 0) {
3193 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3194 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003195
Gilles Peskine449bd832023-01-11 14:50:10 +01003196 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3197 ssl->out_msg + ssl->out_msglen,
3198 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003199
3200 /* Skip over the already-written signature */
3201 ssl->out_msglen += signature_len;
3202 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003203#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003204
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003205 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003206 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3207 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003208
3209 ssl->state++;
3210
Gilles Peskine449bd832023-01-11 14:50:10 +01003211 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3212 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3213 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003214 }
3215
Gilles Peskine449bd832023-01-11 14:50:10 +01003216 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3217 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003218}
3219
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003220MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003221static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003222{
Janos Follath865b3eb2019-12-16 11:46:15 +00003223 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003224
Gilles Peskine449bd832023-01-11 14:50:10 +01003225 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003226
3227 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003228 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3229 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003230
3231 ssl->state++;
3232
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003233#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003234 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3235 mbedtls_ssl_send_flight_completed(ssl);
3236 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003237#endif
3238
Gilles Peskine449bd832023-01-11 14:50:10 +01003239 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3240 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3241 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003242 }
3243
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003244#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003245 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3246 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3247 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3248 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003249 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003250#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003251
Gilles Peskine449bd832023-01-11 14:50:10 +01003252 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003253
Gilles Peskine449bd832023-01-11 14:50:10 +01003254 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003255}
3256
Gilles Peskineac767e52024-09-20 18:08:44 +02003257#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003258
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003259#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003260MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003261static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3262 unsigned char *peer_pms,
3263 size_t *peer_pmslen,
3264 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003265{
Gilles Peskine449bd832023-01-11 14:50:10 +01003266 int ret = ssl->conf->f_async_resume(ssl,
3267 peer_pms, peer_pmslen, peer_pmssize);
3268 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003269 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003270 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003271 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003272 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3273 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003274}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003275#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003276
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003277MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003278static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3279 const unsigned char *p,
3280 const unsigned char *end,
3281 unsigned char *peer_pms,
3282 size_t *peer_pmslen,
3283 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003284{
Janos Follath865b3eb2019-12-16 11:46:15 +00003285 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003286
Gilles Peskine449bd832023-01-11 14:50:10 +01003287 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3288 if (own_cert == NULL) {
3289 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3290 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003291 }
3292 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003293 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3294 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003295
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003296#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003297 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003298 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003299 if (ssl->handshake->async_in_progress != 0) {
3300 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3301 return ssl_resume_decrypt_pms(ssl,
3302 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003303 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003304#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003305
3306 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003307 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003308 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003309 if (p + 2 > end) {
3310 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3311 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003312 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003313 if (*p++ != MBEDTLS_BYTE_1(len) ||
3314 *p++ != MBEDTLS_BYTE_0(len)) {
3315 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3316 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003317 }
3318
Gilles Peskine449bd832023-01-11 14:50:10 +01003319 if (p + len != end) {
3320 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3321 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003322 }
3323
Gilles Peskine422ccab2018-01-11 18:29:01 +01003324 /*
3325 * Decrypt the premaster secret
3326 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003327#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003328 if (ssl->conf->f_async_decrypt_start != NULL) {
3329 ret = ssl->conf->f_async_decrypt_start(ssl,
3330 mbedtls_ssl_own_cert(ssl),
3331 p, len);
3332 switch (ret) {
3333 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3334 /* act as if f_async_decrypt_start was null */
3335 break;
3336 case 0:
3337 ssl->handshake->async_in_progress = 1;
3338 return ssl_resume_decrypt_pms(ssl,
3339 peer_pms,
3340 peer_pmslen,
3341 peer_pmssize);
3342 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3343 ssl->handshake->async_in_progress = 1;
3344 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3345 default:
3346 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3347 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003348 }
3349 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003350#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003351
Gilles Peskine449bd832023-01-11 14:50:10 +01003352 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3353 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3354 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003355 }
3356
Gilles Peskine449bd832023-01-11 14:50:10 +01003357 ret = mbedtls_pk_decrypt(private_key, p, len,
3358 peer_pms, peer_pmslen, peer_pmssize,
3359 ssl->conf->f_rng, ssl->conf->p_rng);
3360 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003361}
3362
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003363MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003364static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3365 const unsigned char *p,
3366 const unsigned char *end,
3367 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003368{
Janos Follath865b3eb2019-12-16 11:46:15 +00003369 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003370 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3371 unsigned char ver[2];
3372 unsigned char fake_pms[48], peer_pms[48];
Dave Rodgman293eedd2023-05-17 12:31:36 +01003373 size_t peer_pmslen;
3374 mbedtls_ct_condition_t diff;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003375
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003376 /* In case of a failure in decryption, the decryption may write less than
3377 * 2 bytes of output, but we always read the first two bytes. It doesn't
3378 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003379 * ret being nonzero, and we only care whether diff is 0.
3380 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3381 * also makes memory analyzers happy (don't access uninitialized memory,
3382 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003383 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003384 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003385
Gilles Peskine449bd832023-01-11 14:50:10 +01003386 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3387 peer_pms,
3388 &peer_pmslen,
3389 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003390
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003391#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003392 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3393 return ret;
3394 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003395#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003396
Gilles Peskine449bd832023-01-11 14:50:10 +01003397 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3398 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003399
3400 /* Avoid data-dependent branches while checking for invalid
3401 * padding, to protect against timing-based Bleichenbacher-type
3402 * attacks. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003403 diff = mbedtls_ct_bool(ret);
Dave Rodgmanb7825ce2023-08-10 11:58:18 +01003404 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pmslen, 48));
3405 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[0], ver[0]));
3406 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[1], ver[1]));
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003407
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003408 /*
3409 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3410 * must not cause the connection to end immediately; instead, send a
3411 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003412 * To protect against timing-based variants of the attack, we must
3413 * not have any branch that depends on whether the decryption was
3414 * successful. In particular, always generate the fake premaster secret,
3415 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003416 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003417 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3418 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003419 /* It's ok to abort on an RNG failure, since this does not reveal
3420 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003421 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003422 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003423
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003424#if defined(MBEDTLS_SSL_DEBUG_ALL)
Dave Rodgman293eedd2023-05-17 12:31:36 +01003425 if (diff != MBEDTLS_CT_FALSE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003426 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3427 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003428#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003429
Gilles Peskine449bd832023-01-11 14:50:10 +01003430 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3431 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3432 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3433 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003434 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003435 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003436
Gilles Peskine422ccab2018-01-11 18:29:01 +01003437 /* Set pms to either the true or the fake PMS, without
3438 * data-dependent branches. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003439 mbedtls_ct_memcpy_if(diff, pms, fake_pms, peer_pms, ssl->handshake->pmslen);
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003440
Gilles Peskine449bd832023-01-11 14:50:10 +01003441 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003442}
Gilles Peskineac767e52024-09-20 18:08:44 +02003443#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003444
Gilles Peskineeccd8882020-03-10 12:19:08 +01003445#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003446MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003447static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3448 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003449{
Paul Bakker6db455e2013-09-18 17:29:31 +02003450 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003451 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003452
Gilles Peskine449bd832023-01-11 14:50:10 +01003453 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3454 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3455 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003456 }
3457
3458 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003459 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003460 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003461 if (end - *p < 2) {
3462 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3463 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003464 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003465
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003466 n = MBEDTLS_GET_UINT16_BE(*p, 0);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003467 *p += 2;
3468
Gilles Peskine449bd832023-01-11 14:50:10 +01003469 if (n == 0 || n > end - *p) {
3470 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3471 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003472 }
3473
Gilles Peskine449bd832023-01-11 14:50:10 +01003474 if (ssl->conf->f_psk != NULL) {
3475 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003476 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003477 }
3478 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003479 /* Identity is not a big secret since clients send it in the clear,
3480 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003481 if (n != ssl->conf->psk_identity_len ||
3482 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003483 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003484 }
3485 }
3486
Gilles Peskine449bd832023-01-11 14:50:10 +01003487 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3488 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3489 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3490 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3491 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003492 }
3493
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003494 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003495
Gilles Peskine449bd832023-01-11 14:50:10 +01003496 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003497}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003498#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003499
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003500MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003501static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003502{
Janos Follath865b3eb2019-12-16 11:46:15 +00003503 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003504 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003505 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003506
Hanno Beckere694c3e2017-12-27 21:34:08 +00003507 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003508
Gilles Peskine449bd832023-01-11 14:50:10 +01003509 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003510
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003511#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskineac767e52024-09-20 18:08:44 +02003512 defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine712e9a12024-09-20 18:11:31 +02003513 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA &&
Gilles Peskine449bd832023-01-11 14:50:10 +01003514 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003515 /* We've already read a record and there is an asynchronous
3516 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003517 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003518 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3519 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003520#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003521 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3522 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3523 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003524 }
3525
Gilles Peskine449bd832023-01-11 14:50:10 +01003526 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003527 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003528
Gilles Peskine449bd832023-01-11 14:50:10 +01003529 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3530 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3531 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003532 }
3533
Gilles Peskine449bd832023-01-11 14:50:10 +01003534 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3535 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3536 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003537 }
3538
Neil Armstrongd91526c2022-04-12 14:38:52 +02003539#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3540 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3541 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3542 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003543 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003544 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3545 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003546 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003547 size_t data_len = (size_t) (*p++);
3548 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003549 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3550 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3551
Gilles Peskine530c4232023-10-02 15:37:23 +02003552 MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003553
3554 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003555 * We must have at least two bytes (1 for length, at least 1 for data)
3556 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003557 if (buf_len < 2) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003558 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3559 buf_len));
3560 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003561 }
3562
Gilles Peskine449bd832023-01-11 14:50:10 +01003563 if (data_len < 1 || data_len > buf_len) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003564 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3565 " > %" MBEDTLS_PRINTF_SIZET,
3566 data_len, buf_len));
3567 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003568 }
3569
3570 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003571 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02003572 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3573 " > %" MBEDTLS_PRINTF_SIZET,
3574 data_len,
3575 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskinec8df8982023-10-02 14:58:16 +02003576 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3577 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003578 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3579 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003580
3581 /* Compute ECDH shared secret. */
3582 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003583 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3584 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003585 handshake->premaster, sizeof(handshake->premaster),
3586 &handshake->pmslen);
3587 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003588 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003589 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003590 if (handshake->xxdh_psa_privkey_is_external == 0) {
3591 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003592 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003593 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003594 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003595 }
3596
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003597 if (handshake->xxdh_psa_privkey_is_external == 0) {
3598 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003599
Gilles Peskine449bd832023-01-11 14:50:10 +01003600 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003601 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003602 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3603 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003604 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003605 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003606 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003607 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003608#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3609 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3610 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3611 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3612#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003613 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3614 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3615 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3616 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003617 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003618
Gilles Peskine449bd832023-01-11 14:50:10 +01003619 if (p != end) {
3620 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3621 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003622 }
3623
Gilles Peskine449bd832023-01-11 14:50:10 +01003624 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003625#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003626#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003627 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong039db292022-03-09 11:38:34 +01003628 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3629 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Michael Schuster7e390282024-05-27 20:07:05 +02003630 size_t ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003631
3632 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3633
Gilles Peskine449bd832023-01-11 14:50:10 +01003634 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3635 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003636 psa_destroy_key(handshake->xxdh_psa_privkey);
3637 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003638 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003639 }
3640
3641 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003642 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003643 psa_destroy_key(handshake->xxdh_psa_privkey);
3644 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003645 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003646 }
3647
Neil Armstrong039db292022-03-09 11:38:34 +01003648 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003649 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003650 psa_destroy_key(handshake->xxdh_psa_privkey);
3651 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003652 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003653 }
3654
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003655 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3656 the sizes of the FFDH keys which are at least 2048 bits.
3657 The size of the array is thus greater than 256 bytes which is greater than any
3658 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003659#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003660 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3661 psa_destroy_key(handshake->xxdh_psa_privkey);
3662 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003663 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003664 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003665#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003666 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3667 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003668#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003669
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003670 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3671 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003672 p += ecpoint_len;
3673
Neil Armstrong3bcef082022-03-23 18:16:54 +01003674 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003675 * - a uint16 containing the length (in octets) of the ECDH computation
3676 * - the octet string produced by the ECDH computation
3677 * - a uint16 containing the length (in octets) of the PSK
3678 * - the PSK itself
3679 */
Neil Armstrong039db292022-03-09 11:38:34 +01003680 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003681 const unsigned char * const psm_end =
3682 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003683 /* uint16 to store length (in octets) of the ECDH computation */
3684 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003685 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003686
3687 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003688 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003689 handshake->xxdh_psa_privkey,
3690 handshake->xxdh_psa_peerkey,
3691 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003692 psm + zlen_size,
3693 psm_end - (psm + zlen_size),
3694 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003695
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003696 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3697 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003698
Gilles Peskine449bd832023-01-11 14:50:10 +01003699 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003700 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003701 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003702 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003703 }
Neil Armstrong039db292022-03-09 11:38:34 +01003704
Neil Armstrong3bcef082022-03-23 18:16:54 +01003705 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003706 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003707 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003708
Gilles Peskine449bd832023-01-11 14:50:10 +01003709 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003710#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
3711#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003712 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
3713 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
3714 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
3715 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003716 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003717 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003718#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003719#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003720 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003721 if ((ret = mbedtls_psa_ecjpake_read_round(
Dave Rodgmane4a6f5a2023-11-04 12:20:09 +00003722 &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
Gilles Peskine449bd832023-01-11 14:50:10 +01003723 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
3724 psa_destroy_key(ssl->handshake->psa_pake_password);
3725 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02003726
Gilles Peskine449bd832023-01-11 14:50:10 +01003727 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
3728 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02003729 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003730 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003731#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003732 {
Gilles Peskine449bd832023-01-11 14:50:10 +01003733 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3734 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003735 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003736
Gilles Peskine449bd832023-01-11 14:50:10 +01003737 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
3738 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
3739 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00003740 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003741
Paul Bakker5121ce52009-01-03 21:22:43 +00003742 ssl->state++;
3743
Gilles Peskine449bd832023-01-11 14:50:10 +01003744 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003745
Gilles Peskine449bd832023-01-11 14:50:10 +01003746 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003747}
3748
Gilles Peskineeccd8882020-03-10 12:19:08 +01003749#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003750MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003751static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003752{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003753 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003754 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003755
Gilles Peskine449bd832023-01-11 14:50:10 +01003756 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003757
Gilles Peskine449bd832023-01-11 14:50:10 +01003758 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3759 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02003760 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003761 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02003762 }
3763
Gilles Peskine449bd832023-01-11 14:50:10 +01003764 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3765 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003766}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003767#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003768MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003769static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003770{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003771 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003772 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003773 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003774 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003775 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003776 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003777 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003778 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003779 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01003780 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003781
Gilles Peskine449bd832023-01-11 14:50:10 +01003782 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003783
Gilles Peskine449bd832023-01-11 14:50:10 +01003784 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3785 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003786 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003787 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003788 }
3789
Hanno Becker2a831a42019-02-07 13:17:25 +00003790#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003791 if (ssl->session_negotiate->peer_cert == NULL) {
3792 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00003793 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003794 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003795 }
3796#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003797 if (ssl->session_negotiate->peer_cert_digest == NULL) {
3798 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00003799 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003800 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003801 }
3802#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3803
Simon Butcher99000142016-10-13 17:21:01 +01003804 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01003805 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
3806 if (0 != ret) {
3807 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
3808 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003809 }
3810
3811 ssl->state++;
3812
Simon Butcher99000142016-10-13 17:21:01 +01003813 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01003814 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
3815 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
3816 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3817 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003818 }
3819
Gilles Peskine449bd832023-01-11 14:50:10 +01003820 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003821
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003822#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3823 peer_pk = &ssl->handshake->peer_pubkey;
3824#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003825 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003826 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01003827 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003828 }
3829 peer_pk = &ssl->session_negotiate->peer_cert->pk;
3830#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3831
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003832 /*
3833 * struct {
3834 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
3835 * opaque signature<0..2^16-1>;
3836 * } DigitallySigned;
3837 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003838 if (i + 2 > ssl->in_hslen) {
3839 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3840 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01003841 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003842
Ronald Cron8457c122022-03-07 11:32:54 +01003843 /*
3844 * Hash
3845 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003846 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01003847
Gilles Peskine449bd832023-01-11 14:50:10 +01003848 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
3849 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3850 " for verify message"));
3851 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003852 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003853
Simon Butcher99000142016-10-13 17:21:01 +01003854#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01003855 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01003856 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01003857 }
Simon Butcher99000142016-10-13 17:21:01 +01003858#endif
Paul Bakker926af752012-11-23 13:38:07 +01003859
Ronald Cron8457c122022-03-07 11:32:54 +01003860 /* Info from md_alg will be used instead */
3861 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003862
Ronald Cron8457c122022-03-07 11:32:54 +01003863 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003864
Ronald Cron8457c122022-03-07 11:32:54 +01003865 /*
3866 * Signature
3867 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003868 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
3869 == MBEDTLS_PK_NONE) {
3870 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3871 " for verify message"));
3872 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02003873 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02003874
Ronald Cron8457c122022-03-07 11:32:54 +01003875 /*
3876 * Check the certificate's key type matches the signature alg
3877 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003878 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
3879 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
3880 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01003881 }
3882
3883 i++;
3884
Gilles Peskine449bd832023-01-11 14:50:10 +01003885 if (i + 2 > ssl->in_hslen) {
3886 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3887 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003888 }
3889
Dave Rodgmana3d0f612023-11-03 23:34:02 +00003890 sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003891 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01003892
Gilles Peskine449bd832023-01-11 14:50:10 +01003893 if (i + sig_len != ssl->in_hslen) {
3894 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3895 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00003896 }
3897
Simon Butcher99000142016-10-13 17:21:01 +01003898 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003899 {
3900 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003901 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
3902 if (0 != ret) {
3903 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
3904 return ret;
3905 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003906 }
Simon Butcher99000142016-10-13 17:21:01 +01003907
Gilles Peskine449bd832023-01-11 14:50:10 +01003908 if ((ret = mbedtls_pk_verify(peer_pk,
3909 md_alg, hash_start, hashlen,
3910 ssl->in_msg + i, sig_len)) != 0) {
3911 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
3912 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003913 }
3914
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003915 ret = mbedtls_ssl_update_handshake_status(ssl);
3916 if (0 != ret) {
3917 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
3918 return ret;
3919 }
Simon Butcher99000142016-10-13 17:21:01 +01003920
Gilles Peskine449bd832023-01-11 14:50:10 +01003921 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003922
Gilles Peskine449bd832023-01-11 14:50:10 +01003923 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003924}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003925#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003926
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003927#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003928MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003929static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003930{
Janos Follath865b3eb2019-12-16 11:46:15 +00003931 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003932 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02003933 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003934
Gilles Peskine449bd832023-01-11 14:50:10 +01003935 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003936
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003937 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3938 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003939
3940 /*
3941 * struct {
3942 * uint32 ticket_lifetime_hint;
3943 * opaque ticket<0..2^16-1>;
3944 * } NewSessionTicket;
3945 *
3946 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
3947 * 8 . 9 ticket_len (n)
3948 * 10 . 9+n ticket content
3949 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02003950
Ronald Cron3c0072b2023-11-22 10:00:14 +01003951#if defined(MBEDTLS_HAVE_TIME)
3952 ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
3953#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003954 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
3955 ssl->session_negotiate,
3956 ssl->out_msg + 10,
3957 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
3958 &tlen, &lifetime)) != 0) {
3959 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003960 tlen = 0;
3961 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003962
Gilles Peskine449bd832023-01-11 14:50:10 +01003963 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
3964 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003965 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003966
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01003967 /*
3968 * Morally equivalent to updating ssl->state, but NewSessionTicket and
3969 * ChangeCipherSpec share the same state.
3970 */
3971 ssl->handshake->new_session_ticket = 0;
3972
Gilles Peskine449bd832023-01-11 14:50:10 +01003973 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3974 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3975 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003976 }
3977
Gilles Peskine449bd832023-01-11 14:50:10 +01003978 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003979
Gilles Peskine449bd832023-01-11 14:50:10 +01003980 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003981}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003982#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003983
Paul Bakker5121ce52009-01-03 21:22:43 +00003984/*
Paul Bakker1961b702013-01-25 14:49:24 +01003985 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00003986 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003987int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003988{
3989 int ret = 0;
3990
Gilles Peskine449bd832023-01-11 14:50:10 +01003991 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01003992
Gilles Peskine449bd832023-01-11 14:50:10 +01003993 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003994 case MBEDTLS_SSL_HELLO_REQUEST:
3995 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00003996 break;
3997
Paul Bakker1961b702013-01-25 14:49:24 +01003998 /*
3999 * <== ClientHello
4000 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004001 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004002 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004003 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004004
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004005#if defined(MBEDTLS_SSL_PROTO_DTLS)
4006 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004007 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004008#endif
4009
Paul Bakker1961b702013-01-25 14:49:24 +01004010 /*
4011 * ==> ServerHello
4012 * Certificate
4013 * ( ServerKeyExchange )
4014 * ( CertificateRequest )
4015 * ServerHelloDone
4016 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004017 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004018 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004019 break;
4020
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004021 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004022 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004023 break;
4024
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004025 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004026 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004027 break;
4028
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004029 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004030 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004031 break;
4032
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004033 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004034 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004035 break;
4036
4037 /*
4038 * <== ( Certificate/Alert )
4039 * ClientKeyExchange
4040 * ( CertificateVerify )
4041 * ChangeCipherSpec
4042 * Finished
4043 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004044 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004045 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004046 break;
4047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004048 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004049 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004050 break;
4051
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004052 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004053 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004054 break;
4055
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004056 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004057 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004058 break;
4059
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004060 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004061 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004062 break;
4063
4064 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004065 * ==> ( NewSessionTicket )
4066 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004067 * Finished
4068 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004069 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4070#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004071 if (ssl->handshake->new_session_ticket != 0) {
4072 ret = ssl_write_new_session_ticket(ssl);
4073 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004074#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004075 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004076 break;
4077
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004078 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004079 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004080 break;
4081
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004082 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004083 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004084 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004085 break;
4086
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004087 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004088 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004089 break;
4090
4091 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004092 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4093 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004094 }
4095
Gilles Peskine449bd832023-01-11 14:50:10 +01004096 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004097}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004098
Gilles Peskine449bd832023-01-11 14:50:10 +01004099void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004100{
TRodziewicz3946f792021-06-14 12:11:18 +02004101 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004102}
4103
Jerry Yufb4b6472022-01-27 15:03:26 +08004104#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */