blob: 4433e8b4ad97fc8dd08882a3051c1545873d36aa [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
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19
Gilles Peskinedb09ef62020-06-03 01:43:33 +020020#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000021
Jerry Yufb4b6472022-01-27 15:03:26 +080022#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yuc5aef882021-12-23 20:15:02 +080023
SimonBd5800b72016-04-26 07:43:27 +010024#include "mbedtls/platform.h"
SimonBd5800b72016-04-26 07:43:27 +010025
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000026#include "mbedtls/ssl.h"
Chris Jones84a773f2021-03-05 18:38:47 +000027#include "ssl_misc.h"
Janos Follath73c616b2019-12-18 15:07:04 +000028#include "mbedtls/debug.h"
29#include "mbedtls/error.h"
Andres Amaya Garcia84914062018-04-24 08:40:46 -050030#include "mbedtls/platform_util.h"
Gabor Mezei22c9a6f2021-10-20 12:09:35 +020031#include "constant_time_internal.h"
Gabor Mezei765862c2021-10-19 12:22:25 +020032#include "mbedtls/constant_time.h"
Rich Evans00ab4702015-02-06 13:43:58 +000033
34#include <string.h>
35
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050036#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek00644842023-05-30 05:45:00 -040037/* Define a local translating function to save code size by not using too many
38 * arguments in each translating place. */
Andrzej Kurek1c7a9982023-05-30 09:21:20 -040039#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED) || \
40 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Andrzej Kurek00644842023-05-30 05:45:00 -040041static int local_err_translation(psa_status_t status)
42{
43 return psa_status_to_mbedtls(status, psa_to_ssl_errors,
Andrzej Kurek1e4a0302023-05-30 09:45:17 -040044 ARRAY_LENGTH(psa_to_ssl_errors),
Andrzej Kurek00644842023-05-30 05:45:00 -040045 psa_generic_status_to_mbedtls);
46}
47#define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050048#endif
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050049#endif
50
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020051#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000052#include "mbedtls/ecp.h"
Paul Bakker41c83d32013-03-20 14:39:14 +010053#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000054
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010056#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020057#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000058
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020059#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +010060int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl,
61 const unsigned char *info,
62 size_t ilen)
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020063{
Gilles Peskine449bd832023-01-11 14:50:10 +010064 if (ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER) {
65 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
66 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020067
Gilles Peskine449bd832023-01-11 14:50:10 +010068 mbedtls_free(ssl->cli_id);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020069
Gilles Peskine449bd832023-01-11 14:50:10 +010070 if ((ssl->cli_id = mbedtls_calloc(1, ilen)) == NULL) {
71 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
72 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020073
Gilles Peskine449bd832023-01-11 14:50:10 +010074 memcpy(ssl->cli_id, info, ilen);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020075 ssl->cli_id_len = ilen;
76
Gilles Peskine449bd832023-01-11 14:50:10 +010077 return 0;
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020078}
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020079
Gilles Peskine449bd832023-01-11 14:50:10 +010080void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf,
81 mbedtls_ssl_cookie_write_t *f_cookie_write,
82 mbedtls_ssl_cookie_check_t *f_cookie_check,
83 void *p_cookie)
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020084{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +020085 conf->f_cookie_write = f_cookie_write;
86 conf->f_cookie_check = f_cookie_check;
87 conf->p_cookie = p_cookie;
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020088}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020089#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020090
Gilles Peskineeccd8882020-03-10 12:19:08 +010091#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020092MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010093static int ssl_conf_has_psk_or_cb(mbedtls_ssl_config const *conf)
Hanno Becker845b9462018-10-26 12:07:29 +010094{
Gilles Peskine449bd832023-01-11 14:50:10 +010095 if (conf->f_psk != NULL) {
96 return 1;
97 }
Hanno Becker845b9462018-10-26 12:07:29 +010098
Gilles Peskine449bd832023-01-11 14:50:10 +010099 if (conf->psk_identity_len == 0 || conf->psk_identity == NULL) {
100 return 0;
101 }
Hanno Becker845b9462018-10-26 12:07:29 +0100102
Hanno Becker845b9462018-10-26 12:07:29 +0100103
104#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100105 if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
106 return 1;
107 }
Neil Armstrong8ecd6682022-05-05 11:40:35 +0200108#endif /* MBEDTLS_USE_PSA_CRYPTO */
109
Gilles Peskine449bd832023-01-11 14:50:10 +0100110 if (conf->psk != NULL && conf->psk_len != 0) {
111 return 1;
112 }
Hanno Becker845b9462018-10-26 12:07:29 +0100113
Gilles Peskine449bd832023-01-11 14:50:10 +0100114 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +0100115}
Gilles Peskineeccd8882020-03-10 12:19:08 +0100116#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker845b9462018-10-26 12:07:29 +0100117
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200118MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100119static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl,
120 const unsigned char *buf,
121 size_t len)
Paul Bakker48916f92012-09-16 19:57:18 +0000122{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200123#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100124 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100125 /* Check verify-data in constant-time. The length OTOH is no secret */
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 if (len != 1 + ssl->verify_data_len ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100127 buf[0] != ssl->verify_data_len ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100128 mbedtls_ct_memcmp(buf + 1, ssl->peer_verify_data,
129 ssl->verify_data_len) != 0) {
130 MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info"));
131 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
132 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
133 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100134 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100135 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200136#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +0000137 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100138 if (len != 1 || buf[0] != 0x0) {
139 MBEDTLS_SSL_DEBUG_MSG(1, ("non-zero length renegotiation info"));
140 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
141 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
142 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +0000143 }
144
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200145 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +0000146 }
Paul Bakker48916f92012-09-16 19:57:18 +0000147
Gilles Peskine449bd832023-01-11 14:50:10 +0100148 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +0000149}
150
Valerio Setti60d3b912023-07-25 10:43:53 +0200151#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200152 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100153 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub925f212022-01-12 11:17:02 +0800154/*
Jerry Yud491ea42022-01-13 16:15:25 +0800155 * Function for parsing a supported groups (TLS 1.3) or supported elliptic
156 * curves (TLS 1.2) extension.
157 *
158 * The "extension_data" field of a supported groups extension contains a
159 * "NamedGroupList" value (TLS 1.3 RFC8446):
160 * enum {
161 * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
162 * x25519(0x001D), x448(0x001E),
163 * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
164 * ffdhe6144(0x0103), ffdhe8192(0x0104),
165 * ffdhe_private_use(0x01FC..0x01FF),
166 * ecdhe_private_use(0xFE00..0xFEFF),
167 * (0xFFFF)
168 * } NamedGroup;
169 * struct {
170 * NamedGroup named_group_list<2..2^16-1>;
171 * } NamedGroupList;
172 *
173 * The "extension_data" field of a supported elliptic curves extension contains
174 * a "NamedCurveList" value (TLS 1.2 RFC 8422):
175 * enum {
176 * deprecated(1..22),
177 * secp256r1 (23), secp384r1 (24), secp521r1 (25),
178 * x25519(29), x448(30),
179 * reserved (0xFE00..0xFEFF),
180 * deprecated(0xFF01..0xFF02),
181 * (0xFFFF)
182 * } NamedCurve;
183 * struct {
184 * NamedCurve named_curve_list<2..2^16-1>
185 * } NamedCurveList;
186 *
Jerry Yub925f212022-01-12 11:17:02 +0800187 * The TLS 1.3 supported groups extension was defined to be a compatible
188 * generalization of the TLS 1.2 supported elliptic curves extension. They both
189 * share the same extension identifier.
Jerry Yud491ea42022-01-13 16:15:25 +0800190 *
Jerry Yub925f212022-01-12 11:17:02 +0800191 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200192MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100193static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
194 const unsigned char *buf,
195 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100196{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200197 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100198 const unsigned char *p;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100199 uint16_t *curves_tls_id;
Paul Bakker41c83d32013-03-20 14:39:14 +0100200
Gilles Peskine449bd832023-01-11 14:50:10 +0100201 if (len < 2) {
202 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
203 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
204 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
205 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +0200206 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100207 list_size = ((buf[0] << 8) | (buf[1]));
208 if (list_size + 2 != len ||
209 list_size % 2 != 0) {
210 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
211 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
212 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
213 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100214 }
215
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200216 /* Should never happen unless client duplicates the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100217 if (ssl->handshake->curves_tls_id != NULL) {
218 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
219 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
220 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
221 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200222 }
223
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100224 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200225 * and leave room for a final 0 */
226 our_size = list_size / 2 + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100227 if (our_size > MBEDTLS_ECP_DP_MAX) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200228 our_size = MBEDTLS_ECP_DP_MAX;
Gilles Peskine449bd832023-01-11 14:50:10 +0100229 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200230
Gilles Peskine449bd832023-01-11 14:50:10 +0100231 if ((curves_tls_id = mbedtls_calloc(our_size,
232 sizeof(*curves_tls_id))) == NULL) {
233 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
234 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
235 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200236 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200237
Valerio Setti18c9fed2022-12-30 17:44:24 +0100238 ssl->handshake->curves_tls_id = curves_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200239
Paul Bakker41c83d32013-03-20 14:39:14 +0100240 p = buf + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100241 while (list_size > 0 && our_size > 1) {
242 uint16_t curr_tls_id = MBEDTLS_GET_UINT16_BE(p, 0);
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200243
Gilles Peskine449bd832023-01-11 14:50:10 +0100244 if (mbedtls_ssl_get_ecp_group_id_from_tls_id(curr_tls_id) !=
245 MBEDTLS_ECP_DP_NONE) {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100246 *curves_tls_id++ = curr_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200247 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100248 }
249
250 list_size -= 2;
251 p += 2;
252 }
253
Gilles Peskine449bd832023-01-11 14:50:10 +0100254 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100255}
256
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200257MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100258static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl,
259 const unsigned char *buf,
260 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100261{
262 size_t list_size;
263 const unsigned char *p;
264
Gilles Peskine449bd832023-01-11 14:50:10 +0100265 if (len == 0 || (size_t) (buf[0] + 1) != len) {
266 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
267 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
268 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
269 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100270 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200271 list_size = buf[0];
Paul Bakker41c83d32013-03-20 14:39:14 +0100272
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200273 p = buf + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100274 while (list_size > 0) {
275 if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
276 p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
Valerio Setti7aeec542023-07-05 18:57:21 +0200277#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
278 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200279 ssl->handshake->ecdh_ctx.point_format = p[0];
Valerio Setti7aeec542023-07-05 18:57:21 +0200280#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED */
Neil Armstrongca7d5062022-05-31 14:43:23 +0200281#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100282 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
283 mbedtls_ecjpake_set_point_format(&ssl->handshake->ecjpake_ctx,
284 p[0]);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200285#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +0100286 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
287 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100288 }
289
290 list_size--;
291 p++;
292 }
293
Gilles Peskine449bd832023-01-11 14:50:10 +0100294 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100295}
Valerio Setti60d3b912023-07-25 10:43:53 +0200296#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +0200297 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +0200298 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100299
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200300#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200301MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100302static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
303 const unsigned char *buf,
304 size_t len)
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200305{
Janos Follath865b3eb2019-12-16 11:46:15 +0000306 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200307
Neil Armstrongca7d5062022-05-31 14:43:23 +0200308#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100309 if (ssl->handshake->psa_pake_ctx_is_ok != 1)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200310#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100311 if (mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200312#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200313 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100314 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
315 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200316 }
317
Neil Armstrongca7d5062022-05-31 14:43:23 +0200318#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100319 if ((ret = mbedtls_psa_ecjpake_read_round(
320 &ssl->handshake->psa_pake_ctx, buf, len,
321 MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
322 psa_destroy_key(ssl->handshake->psa_pake_password);
323 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200324
Gilles Peskine449bd832023-01-11 14:50:10 +0100325 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
Valerio Setti02c25b52022-11-15 14:08:42 +0100326 mbedtls_ssl_send_alert_message(
Gilles Peskine449bd832023-01-11 14:50:10 +0100327 ssl,
328 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
329 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200330
Gilles Peskine449bd832023-01-11 14:50:10 +0100331 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200332 }
333#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100334 if ((ret = mbedtls_ecjpake_read_round_one(&ssl->handshake->ecjpake_ctx,
335 buf, len)) != 0) {
336 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_one", ret);
337 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
338 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
339 return ret;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200340 }
Neil Armstrongca7d5062022-05-31 14:43:23 +0200341#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200342
343 /* Only mark the extension as OK when we're sure it is */
344 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
345
Gilles Peskine449bd832023-01-11 14:50:10 +0100346 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200347}
348#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200350#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200351MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100352static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
353 const unsigned char *buf,
354 size_t len)
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200355{
Gilles Peskine449bd832023-01-11 14:50:10 +0100356 if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
357 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
358 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
359 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
360 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200361 }
362
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200363 ssl->session_negotiate->mfl_code = buf[0];
364
Gilles Peskine449bd832023-01-11 14:50:10 +0100365 return 0;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200366}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200367#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200368
Hanno Beckera0e20d02019-05-15 14:03:01 +0100369#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200370MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100371static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
372 const unsigned char *buf,
373 size_t len)
Hanno Becker89dcc882019-04-26 13:56:39 +0100374{
375 size_t peer_cid_len;
376
377 /* CID extension only makes sense in DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100378 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
379 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
380 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
381 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
382 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100383 }
384
385 /*
Hanno Becker89dcc882019-04-26 13:56:39 +0100386 * struct {
387 * opaque cid<0..2^8-1>;
388 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +0100389 */
Hanno Becker89dcc882019-04-26 13:56:39 +0100390
Gilles Peskine449bd832023-01-11 14:50:10 +0100391 if (len < 1) {
392 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
393 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
394 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
395 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100396 }
397
398 peer_cid_len = *buf++;
399 len--;
400
Gilles Peskine449bd832023-01-11 14:50:10 +0100401 if (len != peer_cid_len) {
402 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
403 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
404 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
405 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100406 }
407
408 /* Ignore CID if the user has disabled its use. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100409 if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker89dcc882019-04-26 13:56:39 +0100410 /* Leave ssl->handshake->cid_in_use in its default
411 * value of MBEDTLS_SSL_CID_DISABLED. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled"));
413 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100414 }
415
Gilles Peskine449bd832023-01-11 14:50:10 +0100416 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
417 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
418 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
419 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
420 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100421 }
422
Hanno Becker08556bf2019-05-03 12:43:44 +0100423 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker89dcc882019-04-26 13:56:39 +0100424 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100425 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100426
Gilles Peskine449bd832023-01-11 14:50:10 +0100427 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
428 MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100429
Gilles Peskine449bd832023-01-11 14:50:10 +0100430 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100431}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100432#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100433
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200434#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200435MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100436static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
437 const unsigned char *buf,
438 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100439{
Gilles Peskine449bd832023-01-11 14:50:10 +0100440 if (len != 0) {
441 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
442 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
443 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
444 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100445 }
446
447 ((void) buf);
448
Gilles Peskine449bd832023-01-11 14:50:10 +0100449 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200450 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100451 }
452
Gilles Peskine449bd832023-01-11 14:50:10 +0100453 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100454}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200455#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100456
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200457#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200458MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100459static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
460 const unsigned char *buf,
461 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200462{
Gilles Peskine449bd832023-01-11 14:50:10 +0100463 if (len != 0) {
464 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
465 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
466 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
467 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200468 }
469
470 ((void) buf);
471
Gilles Peskine449bd832023-01-11 14:50:10 +0100472 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200473 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200474 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200475
Gilles Peskine449bd832023-01-11 14:50:10 +0100476 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200477}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200478#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200479
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200480#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200481MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100482static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
483 unsigned char *buf,
484 size_t len)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200485{
Janos Follath865b3eb2019-12-16 11:46:15 +0000486 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200487 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200488
Gilles Peskine449bd832023-01-11 14:50:10 +0100489 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200490
Gilles Peskine449bd832023-01-11 14:50:10 +0100491 if (ssl->conf->f_ticket_parse == NULL ||
492 ssl->conf->f_ticket_write == NULL) {
493 return 0;
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200494 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200495
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200496 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200497 ssl->handshake->new_session_ticket = 1;
498
Gilles Peskine449bd832023-01-11 14:50:10 +0100499 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200500
Gilles Peskine449bd832023-01-11 14:50:10 +0100501 if (len == 0) {
502 return 0;
503 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200504
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200505#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100506 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
507 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
508 return 0;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200509 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200510#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200511
512 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200513 * Failures are ok: just ignore the ticket and proceed.
514 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100515 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session,
516 buf, len)) != 0) {
517 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200518
Gilles Peskine449bd832023-01-11 14:50:10 +0100519 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
520 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
521 } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
522 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
523 } else {
524 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
525 }
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200526
Gilles Peskine449bd832023-01-11 14:50:10 +0100527 return 0;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200528 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200529
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200530 /*
531 * Keep the session ID sent by the client, since we MUST send it back to
532 * inform them we're accepting the ticket (RFC 5077 section 3.4)
533 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200534 session.id_len = ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100535 memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200536
Gilles Peskine449bd832023-01-11 14:50:10 +0100537 mbedtls_ssl_session_free(ssl->session_negotiate);
538 memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200539
540 /* Zeroize instead of free as we copied the content */
Gilles Peskine449bd832023-01-11 14:50:10 +0100541 mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200542
Gilles Peskine449bd832023-01-11 14:50:10 +0100543 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200544
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200545 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200546
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200547 /* Don't send a new ticket after all, this one is OK */
548 ssl->handshake->new_session_ticket = 0;
549
Gilles Peskine449bd832023-01-11 14:50:10 +0100550 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200551}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200552#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200553
Johan Pascalb62bb512015-12-03 21:56:45 +0100554#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200555MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100556static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
557 const unsigned char *buf,
558 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100559{
Johan Pascal43f94902020-09-22 12:25:52 +0200560 mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
Gilles Peskine449bd832023-01-11 14:50:10 +0100561 size_t i, j;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200562 size_t profile_length;
563 uint16_t mki_length;
Ron Eldor313d7b52018-12-10 14:56:21 +0200564 /*! 2 bytes for profile length and 1 byte for mki len */
565 const size_t size_of_lengths = 3;
Johan Pascalb62bb512015-12-03 21:56:45 +0100566
567 /* If use_srtp is not configured, just ignore the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100568 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
569 (ssl->conf->dtls_srtp_profile_list == NULL) ||
570 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
571 return 0;
Johan Pascal85269572020-08-25 10:01:54 +0200572 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100573
574 /* RFC5764 section 4.1.1
575 * uint8 SRTPProtectionProfile[2];
576 *
577 * struct {
578 * SRTPProtectionProfiles SRTPProtectionProfiles;
579 * opaque srtp_mki<0..255>;
580 * } UseSRTPData;
581
582 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100583 */
584
Ron Eldoref72faf2018-07-12 11:54:20 +0300585 /*
586 * Min length is 5: at least one protection profile(2 bytes)
587 * and length(2 bytes) + srtp_mki length(1 byte)
Johan Pascal042d4562020-08-25 12:14:02 +0200588 * Check here that we have at least 2 bytes of protection profiles length
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200589 * and one of srtp_mki length
Ron Eldoref72faf2018-07-12 11:54:20 +0300590 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100591 if (len < size_of_lengths) {
592 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
593 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
594 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200595 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100596
Gilles Peskine449bd832023-01-11 14:50:10 +0100597 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200598
Ron Eldoref72faf2018-07-12 11:54:20 +0300599 /* first 2 bytes are protection profile length(in bytes) */
Gilles Peskine449bd832023-01-11 14:50:10 +0100600 profile_length = (buf[0] << 8) | buf[1];
Johan Pascal042d4562020-08-25 12:14:02 +0200601 buf += 2;
Ron Eldor591f1622018-01-22 12:30:04 +0200602
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200603 /* The profile length cannot be bigger than input buffer size - lengths fields */
Gilles Peskine449bd832023-01-11 14:50:10 +0100604 if (profile_length > len - size_of_lengths ||
605 profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */
606 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
607 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
608 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200609 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300610 /*
611 * parse the extension list values are defined in
612 * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
613 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100614 for (j = 0; j < profile_length; j += 2) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200615 uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
Gilles Peskine449bd832023-01-11 14:50:10 +0100616 client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
Johan Pascalb62bb512015-12-03 21:56:45 +0100617
Gilles Peskine449bd832023-01-11 14:50:10 +0100618 if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
619 MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
620 mbedtls_ssl_get_srtp_profile_as_string(
621 client_protection)));
622 } else {
Johan Pascal85269572020-08-25 10:01:54 +0200623 continue;
624 }
Ron Eldor591f1622018-01-22 12:30:04 +0200625 /* check if suggested profile is in our list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100626 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
627 if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
Ron Eldor3adb9922017-12-21 10:15:08 +0200628 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100629 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
630 mbedtls_ssl_get_srtp_profile_as_string(
631 client_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +0200632 break;
Johan Pascalb62bb512015-12-03 21:56:45 +0100633 }
634 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100635 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) {
Ron Eldor591f1622018-01-22 12:30:04 +0200636 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100637 }
Ron Eldor591f1622018-01-22 12:30:04 +0200638 }
Johan Pascal042d4562020-08-25 12:14:02 +0200639 buf += profile_length; /* buf points to the mki length */
640 mki_length = *buf;
641 buf++;
Ron Eldor591f1622018-01-22 12:30:04 +0200642
Gilles Peskine449bd832023-01-11 14:50:10 +0100643 if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
644 mki_length + profile_length + size_of_lengths != len) {
645 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
646 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
647 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Johan Pascal042d4562020-08-25 12:14:02 +0200648 }
649
650 /* Parse the mki only if present and mki is supported locally */
Gilles Peskine449bd832023-01-11 14:50:10 +0100651 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
652 mki_length > 0) {
Johan Pascal042d4562020-08-25 12:14:02 +0200653 ssl->dtls_srtp_info.mki_len = mki_length;
654
Gilles Peskine449bd832023-01-11 14:50:10 +0100655 memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
Ron Eldorb4655392018-07-05 18:25:39 +0300656
Gilles Peskine449bd832023-01-11 14:50:10 +0100657 MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value,
658 ssl->dtls_srtp_info.mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100659 }
660
Gilles Peskine449bd832023-01-11 14:50:10 +0100661 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100662}
663#endif /* MBEDTLS_SSL_DTLS_SRTP */
664
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100665/*
666 * Auxiliary functions for ServerHello parsing and related actions
667 */
668
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200669#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100670/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100671 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100672 */
Valerio Settie9646ec2023-08-02 20:02:28 +0200673#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200674MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100675static int ssl_check_key_curve(mbedtls_pk_context *pk,
676 uint16_t *curves_tls_id)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100677{
Valerio Setti18c9fed2022-12-30 17:44:24 +0100678 uint16_t *curr_tls_id = curves_tls_id;
Valerio Settie7cefae2023-10-06 13:19:48 +0200679#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
680 mbedtls_ecp_group_id grp_id = mbedtls_ecc_group_of_psa(pk->ec_family, pk->ec_bits, 0);
681#else
Valerio Setti77a75682023-05-15 11:18:46 +0200682 mbedtls_ecp_group_id grp_id = mbedtls_pk_ec_ro(*pk)->grp.id;
Valerio Settie7cefae2023-10-06 13:19:48 +0200683#endif
Valerio Setti18c9fed2022-12-30 17:44:24 +0100684 mbedtls_ecp_group_id curr_grp_id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100685
Gilles Peskine449bd832023-01-11 14:50:10 +0100686 while (*curr_tls_id != 0) {
687 curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
688 if (curr_grp_id == grp_id) {
689 return 0;
690 }
Valerio Setti18c9fed2022-12-30 17:44:24 +0100691 curr_tls_id++;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100692 }
693
Gilles Peskine449bd832023-01-11 14:50:10 +0100694 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100695}
Valerio Settie9646ec2023-08-02 20:02:28 +0200696#endif /* MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100697
698/*
699 * Try picking a certificate for this ciphersuite,
700 * return 0 on success and -1 on failure.
701 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200702MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100703static int ssl_pick_cert(mbedtls_ssl_context *ssl,
704 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100705{
Glenn Strauss041a3762022-03-15 06:08:29 -0400706 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200707#if defined(MBEDTLS_USE_PSA_CRYPTO)
708 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100709 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200710 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100711 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200712#else
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100713 mbedtls_pk_type_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100714 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200715#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200716 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100717
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200718#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100719 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100720 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100721 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100722#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100723 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100724
David Horstmann3a334c22022-10-25 10:53:44 +0100725 int pk_alg_is_none = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200726#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100727 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200728#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100729 pk_alg_is_none = (pk_alg == MBEDTLS_PK_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200730#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100731 if (pk_alg_is_none) {
732 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200733 }
734
Gilles Peskine449bd832023-01-11 14:50:10 +0100735 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
736
737 if (list == NULL) {
738 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
739 return -1;
740 }
741
742 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400743 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100744 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
745 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000746
David Horstmann3a334c22022-10-25 10:53:44 +0100747 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200748#if defined(MBEDTLS_USE_PSA_CRYPTO)
749#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100750 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
751 ssl->conf->f_async_decrypt_start != NULL ||
752 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
753 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200754#else
David Horstmann3a334c22022-10-25 10:53:44 +0100755 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100756 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200757#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
758#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100759 key_type_matches = mbedtls_pk_can_do(&cur->cert->pk, pk_alg);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200760#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100761 if (!key_type_matches) {
762 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100763 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000764 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100765
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200766 /*
767 * This avoids sending the client a cert it'll reject based on
768 * keyUsage or other extensions.
769 *
770 * It also allows the user to provision different certificates for
771 * different uses based on keyUsage, eg if they want to avoid signing
772 * and decrypting with the same RSA key.
773 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100774 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
775 MBEDTLS_SSL_IS_SERVER, &flags) != 0) {
776 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
777 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200778 continue;
779 }
780
Valerio Settie9646ec2023-08-02 20:02:28 +0200781#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100782 if (pk_alg == MBEDTLS_PK_ECDSA &&
783 ssl_check_key_curve(&cur->cert->pk,
784 ssl->handshake->curves_tls_id) != 0) {
785 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100786 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000787 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100788#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100789
790 /* If we get there, we got a winner */
791 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100792 }
793
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200794 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100795 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100796 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100797 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
798 ssl->handshake->key_cert->cert);
799 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100800 }
801
Gilles Peskine449bd832023-01-11 14:50:10 +0100802 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100803}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200804#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100805
806/*
807 * Check if a given ciphersuite is suitable for use with our config/keys/etc
808 * Sets ciphersuite_info only if the suite matches.
809 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200810MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100811static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
812 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100813{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200814 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100815
Jerry Yue7541932022-01-28 10:21:24 +0800816#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100817 mbedtls_pk_type_t sig_type;
818#endif
819
Gilles Peskine449bd832023-01-11 14:50:10 +0100820 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
821 if (suite_info == NULL) {
822 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
823 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100824 }
825
Gilles Peskine449bd832023-01-11 14:50:10 +0100826 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
827 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000828
Gilles Peskine449bd832023-01-11 14:50:10 +0100829 if (suite_info->min_tls_version > ssl->tls_version ||
830 suite_info->max_tls_version < ssl->tls_version) {
831 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
832 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000833 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100834
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200835#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100836 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
837 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
838 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
839 "not configured or ext missing"));
840 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200841 }
842#endif
843
844
Valerio Setti60d3b912023-07-25 10:43:53 +0200845#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200846 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100847 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
848 (ssl->handshake->curves_tls_id == NULL ||
849 ssl->handshake->curves_tls_id[0] == 0)) {
850 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
851 "no common elliptic curve"));
852 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000853 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100854#endif
855
Gilles Peskineeccd8882020-03-10 12:19:08 +0100856#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100857 /* If the ciphersuite requires a pre-shared key and we don't
858 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100859 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
860 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
861 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
862 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000863 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100864#endif
865
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200866#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100867 /*
868 * Final check: if ciphersuite requires us to have a
869 * certificate/key of a particular type:
870 * - select the appropriate certificate if we have one, or
871 * - try the next ciphersuite if we don't
872 * This must be done last since we modify the key_cert list.
873 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100874 if (ssl_pick_cert(ssl, suite_info) != 0) {
875 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
876 "no suitable certificate"));
877 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000878 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100879#endif
880
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200881#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
882 /* If the ciphersuite requires signing, check whether
883 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100884 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
885 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200886 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100887 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
888 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
889 "for signature algorithm %u", (unsigned) sig_type));
890 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200891 }
892
893#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
894
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100895 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100897}
898
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200899/* This function doesn't alert on errors that happen early during
900 ClientHello parsing because they might indicate that the client is
901 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200902MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100903static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000904{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100905 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200906 size_t i, j;
907 size_t ciph_offset, comp_offset, ext_offset;
908 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200909#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200910 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100911#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000912 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200913#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000914 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100915#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000916 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200917 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200918 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000919
Hanno Becker7e5437a2017-04-28 17:15:26 +0100920 /* If there is no signature-algorithm extension present,
921 * we need to fall back to the default values for allowed
922 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800923#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100924 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800925#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100926
Gilles Peskine449bd832023-01-11 14:50:10 +0100927 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000928
David Horstmanne0af39a2022-10-06 18:19:18 +0100929 int renegotiating;
930
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200931#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200932read_record_header:
933#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100934 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200935 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100936 * otherwise read it ourselves manually in order to support SSLv2
937 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100938 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
939 * ClientHello has been already fully fetched by the TLS 1.3 code and the
940 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100941 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100942 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200943#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100945#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100946 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100947 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200948 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100949 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
950 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000951 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000952 }
953
954 buf = ssl->in_hdr;
955
Gilles Peskine449bd832023-01-11 14:50:10 +0100956 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000957
Paul Bakkerec636f32012-09-09 19:17:02 +0000958 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100959 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000960 *
961 * Record layer:
962 * 0 . 0 message type
963 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200964 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000965 * 3 . 4 message length
966 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100967 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
968 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100969
Gilles Peskine449bd832023-01-11 14:50:10 +0100970 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
971 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
972 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100973 }
974
Gilles Peskine449bd832023-01-11 14:50:10 +0100975 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
976 (ssl->in_len[0] << 8) | ssl->in_len[1]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100977
Gilles Peskine449bd832023-01-11 14:50:10 +0100978 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
979 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100980
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200981 /* For DTLS if this is the initial handshake, remember the client sequence
982 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200983#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100984 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200985#if defined(MBEDTLS_SSL_RENEGOTIATION)
986 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000987#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100988 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200989 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100990 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
991 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
992 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200993 }
994
Gilles Peskine449bd832023-01-11 14:50:10 +0100995 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
996 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200997
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200998#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100999 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
1000 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001001 ssl->next_record_offset = 0;
1002 ssl->in_left = 0;
1003 goto read_record_header;
1004 }
1005
1006 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +01001007 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001008#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001009 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001010#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001011
Gilles Peskine449bd832023-01-11 14:50:10 +01001012 msg_len = (ssl->in_len[0] << 8) | ssl->in_len[1];
Paul Bakker5121ce52009-01-03 21:22:43 +00001013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001014#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001015 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001016 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001017 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +01001018 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001019#endif
Paul Bakkerec636f32012-09-09 19:17:02 +00001020 {
Ronald Cron6291b232023-03-08 15:51:25 +01001021 if (ssl->keep_current_message) {
1022 ssl->keep_current_message = 0;
1023 } else {
1024 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
1025 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1026 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1027 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001028
Ronald Cron6291b232023-03-08 15:51:25 +01001029 if ((ret = mbedtls_ssl_fetch_input(ssl,
1030 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
1031 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
1032 return ret;
1033 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001034
Ronald Cron6291b232023-03-08 15:51:25 +01001035 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001036#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +01001037 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1038 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
1039 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001040#endif
Ronald Cron6291b232023-03-08 15:51:25 +01001041 ssl->in_left = 0;
1042 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001043 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001044
1045 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +00001046
Gilles Peskine449bd832023-01-11 14:50:10 +01001047 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001048
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001049 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
1050 if (0 != ret) {
1051 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1052 return ret;
1053 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001054
1055 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001056 * Handshake layer:
1057 * 0 . 0 handshake type
1058 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001059 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001060 * 6 . 8 DTLS only: fragment offset
1061 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001062 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001063 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1064 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1065 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001066 }
1067
Gilles Peskine449bd832023-01-11 14:50:10 +01001068 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001069
Gilles Peskine449bd832023-01-11 14:50:10 +01001070 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1071 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1072 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001073 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001074 {
Gilles Peskine449bd832023-01-11 14:50:10 +01001075 size_t handshake_len = MBEDTLS_GET_UINT24_BE(buf, 1);
1076 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %u",
1077 (unsigned) handshake_len));
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001078
1079 /* The record layer has a record size limit of 2^14 - 1 and
1080 * fragmentation is not supported, so buf[1] should be zero. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001081 if (buf[1] != 0) {
1082 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != 0",
1083 (unsigned) buf[1]));
1084 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001085 }
1086
1087 /* We don't support fragmentation of ClientHello (yet?) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001088 if (msg_len != mbedtls_ssl_hs_hdr_len(ssl) + handshake_len) {
1089 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != %u + %u",
1090 (unsigned) msg_len,
1091 (unsigned) mbedtls_ssl_hs_hdr_len(ssl),
1092 (unsigned) handshake_len));
1093 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001094 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001095 }
1096
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001097#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001098 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001099 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001100 * Copy the client's handshake message_seq on initial handshakes,
1101 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001102 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001103#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001104 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001105 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001106 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001107 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1108 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1109 "%u (expected %u)", cli_msg_seq,
1110 ssl->handshake->in_msg_seq));
1111 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001112 }
1113
1114 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001115 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001116#endif
1117 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001118 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001119 ssl->handshake->out_msg_seq = cli_msg_seq;
1120 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1121 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001122 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001123 /*
1124 * For now we don't support fragmentation, so make sure
1125 * fragment_offset == 0 and fragment_length == length
1126 */
1127 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001128 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1129 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1130 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001131 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001132 4, ("fragment_offset=%u fragment_length=%u length=%u",
1133 (unsigned) fragment_offset, (unsigned) fragment_length,
1134 (unsigned) length));
1135 if (fragment_offset != 0 || length != fragment_length) {
1136 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1137 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001138 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001139 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001140 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001141#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001142
Gilles Peskine449bd832023-01-11 14:50:10 +01001143 buf += mbedtls_ssl_hs_hdr_len(ssl);
1144 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001145
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001146 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001147 * ClientHello layer:
1148 * 0 . 1 protocol version
1149 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
1150 * 34 . 35 session id length (1 byte)
1151 * 35 . 34+x session id
1152 * 35+x . 35+x DTLS only: cookie length (1 byte)
1153 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001154 * .. . .. ciphersuite list length (2 bytes)
1155 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001156 * .. . .. compression alg. list length (1 byte)
1157 * .. . .. compression alg. list
1158 * .. . .. extensions length (2 bytes, optional)
1159 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001160 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001161
1162 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001163 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001164 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1165 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001166 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001167 if (msg_len < 38) {
1168 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1169 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001170 }
1171
1172 /*
1173 * Check and save the protocol version
1174 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001175 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001176
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001177 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1178 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001179 ssl->session_negotiate->tls_version = ssl->tls_version;
Paul Bakkerec636f32012-09-09 19:17:02 +00001180
Gilles Peskine449bd832023-01-11 14:50:10 +01001181 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1182 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1183 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1184 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1185 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001186 }
1187
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001188 /*
1189 * Save client random (inc. Unix time)
1190 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001191 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001192
Gilles Peskine449bd832023-01-11 14:50:10 +01001193 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001194
1195 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001196 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001197 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001198 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001199
Gilles Peskine449bd832023-01-11 14:50:10 +01001200 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1201 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1202 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1203 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1204 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1205 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001206 }
1207
Gilles Peskine449bd832023-01-11 14:50:10 +01001208 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001209
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001210 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001211 memset(ssl->session_negotiate->id, 0,
1212 sizeof(ssl->session_negotiate->id));
1213 memcpy(ssl->session_negotiate->id, buf + 35,
1214 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001215
1216 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001217 * Check the cookie length and content
1218 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001219#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001220 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001221 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001222 cookie_len = buf[cookie_offset];
1223
Gilles Peskine449bd832023-01-11 14:50:10 +01001224 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1225 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1226 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1227 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1228 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001229 }
1230
Gilles Peskine449bd832023-01-11 14:50:10 +01001231 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1232 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001233
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001234#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001235 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001236#if defined(MBEDTLS_SSL_RENEGOTIATION)
1237 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001238#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001239 ) {
1240 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1241 buf + cookie_offset + 1, cookie_len,
1242 ssl->cli_id, ssl->cli_id_len) != 0) {
1243 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001244 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001245 } else {
1246 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001247 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001248 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001249 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001250#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001251 {
1252 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001253 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001254 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001255 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1256 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001257 }
1258
Gilles Peskine449bd832023-01-11 14:50:10 +01001259 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001260 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001261
Gilles Peskine449bd832023-01-11 14:50:10 +01001262 /*
1263 * Check the ciphersuitelist length (will be parsed later)
1264 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001265 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001266 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001267#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001268 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001269
Gilles Peskine449bd832023-01-11 14:50:10 +01001270 ciph_len = (buf[ciph_offset + 0] << 8)
1271 | (buf[ciph_offset + 1]);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001272
Gilles Peskine449bd832023-01-11 14:50:10 +01001273 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001274 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001275 (ciph_len % 2) != 0) {
1276 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1277 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1278 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1279 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001280 }
1281
Gilles Peskine449bd832023-01-11 14:50:10 +01001282 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1283 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001284
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001285 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001286 * Check the compression algorithm's length.
1287 * The list contents are ignored because implementing
1288 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1289 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001290 */
1291 comp_offset = ciph_offset + 2 + ciph_len;
1292
1293 comp_len = buf[comp_offset];
1294
Gilles Peskine449bd832023-01-11 14:50:10 +01001295 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001296 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001297 comp_len + comp_offset + 1 > msg_len) {
1298 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1299 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1300 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1301 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001302 }
1303
Gilles Peskine449bd832023-01-11 14:50:10 +01001304 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1305 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001306
Gilles Peskine449bd832023-01-11 14:50:10 +01001307 /*
1308 * Check the extension length
1309 */
1310 ext_offset = comp_offset + 1 + comp_len;
1311 if (msg_len > ext_offset) {
1312 if (msg_len < ext_offset + 2) {
1313 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1314 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1315 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1316 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001317 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001318
Gilles Peskine449bd832023-01-11 14:50:10 +01001319 ext_len = (buf[ext_offset + 0] << 8)
1320 | (buf[ext_offset + 1]);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001321
Gilles Peskine449bd832023-01-11 14:50:10 +01001322 if (msg_len != ext_offset + 2 + ext_len) {
1323 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1324 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1325 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1326 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1327 }
1328 } else {
1329 ext_len = 0;
1330 }
Paul Bakker48916f92012-09-16 19:57:18 +00001331
Gilles Peskine449bd832023-01-11 14:50:10 +01001332 ext = buf + ext_offset + 2;
1333 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1334
1335 while (ext_len != 0) {
1336 unsigned int ext_id;
1337 unsigned int ext_size;
1338 if (ext_len < 4) {
1339 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1340 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1341 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1342 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1343 }
1344 ext_id = ((ext[0] << 8) | (ext[1]));
1345 ext_size = ((ext[2] << 8) | (ext[3]));
1346
1347 if (ext_size + 4 > ext_len) {
1348 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1349 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1350 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1351 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1352 }
1353 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001354#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001355 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001356 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1357 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1358 ext + 4 + ext_size);
1359 if (ret != 0) {
1360 return ret;
1361 }
Simon Butcher584a5472016-05-23 16:24:52 +01001362 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001363#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001364
Simon Butcher584a5472016-05-23 16:24:52 +01001365 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001366 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001367#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001368 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001369#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001370
Gilles Peskine449bd832023-01-11 14:50:10 +01001371 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1372 if (ret != 0) {
1373 return ret;
1374 }
Simon Butcher584a5472016-05-23 16:24:52 +01001375 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001376
Jerry Yue7541932022-01-28 10:21:24 +08001377#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001378 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001379 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001380
Gilles Peskine449bd832023-01-11 14:50:10 +01001381 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1382 if (ret != 0) {
1383 return ret;
1384 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001385
1386 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001387 break;
Jerry Yue7541932022-01-28 10:21:24 +08001388#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001389
Valerio Setti60d3b912023-07-25 10:43:53 +02001390#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001391 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001392 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001393 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001394 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001395
Gilles Peskine449bd832023-01-11 14:50:10 +01001396 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1397 if (ret != 0) {
1398 return ret;
1399 }
Simon Butcher584a5472016-05-23 16:24:52 +01001400 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001401
Simon Butcher584a5472016-05-23 16:24:52 +01001402 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001403 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001404 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001405
Gilles Peskine449bd832023-01-11 14:50:10 +01001406 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1407 if (ret != 0) {
1408 return ret;
1409 }
Simon Butcher584a5472016-05-23 16:24:52 +01001410 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001411#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001412 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001413 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001414
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001415#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001416 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001417 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001418
Gilles Peskine449bd832023-01-11 14:50:10 +01001419 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1420 if (ret != 0) {
1421 return ret;
1422 }
Simon Butcher584a5472016-05-23 16:24:52 +01001423 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001424#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1425
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001426#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001427 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001428 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001429
Gilles Peskine449bd832023-01-11 14:50:10 +01001430 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1431 if (ret != 0) {
1432 return ret;
1433 }
Simon Butcher584a5472016-05-23 16:24:52 +01001434 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001435#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001436
Hanno Beckera0e20d02019-05-15 14:03:01 +01001437#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001438 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001439 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001440
Gilles Peskine449bd832023-01-11 14:50:10 +01001441 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1442 if (ret != 0) {
1443 return ret;
1444 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001445 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001446#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001447
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001448#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001449 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001450 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001451
Gilles Peskine449bd832023-01-11 14:50:10 +01001452 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1453 if (ret != 0) {
1454 return ret;
1455 }
Simon Butcher584a5472016-05-23 16:24:52 +01001456 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001457#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001458
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001459#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001460 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001461 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001462
Gilles Peskine449bd832023-01-11 14:50:10 +01001463 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1464 if (ret != 0) {
1465 return ret;
1466 }
Simon Butcher584a5472016-05-23 16:24:52 +01001467 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001468#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001469
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001470#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001471 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001472 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001473
Gilles Peskine449bd832023-01-11 14:50:10 +01001474 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1475 if (ret != 0) {
1476 return ret;
1477 }
Simon Butcher584a5472016-05-23 16:24:52 +01001478 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001479#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001480
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001481#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001482 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001483 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001484
Gilles Peskine449bd832023-01-11 14:50:10 +01001485 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1486 ext + 4 + ext_size);
1487 if (ret != 0) {
1488 return ret;
1489 }
Simon Butcher584a5472016-05-23 16:24:52 +01001490 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001491#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001492
Johan Pascalb62bb512015-12-03 21:56:45 +01001493#if defined(MBEDTLS_SSL_DTLS_SRTP)
1494 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001495 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001496
Gilles Peskine449bd832023-01-11 14:50:10 +01001497 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1498 if (ret != 0) {
1499 return ret;
1500 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001501 break;
1502#endif /* MBEDTLS_SSL_DTLS_SRTP */
1503
Simon Butcher584a5472016-05-23 16:24:52 +01001504 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001505 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1506 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001507 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001508
Gilles Peskine449bd832023-01-11 14:50:10 +01001509 ext_len -= 4 + ext_size;
1510 ext += 4 + ext_size;
1511 }
1512
Jerry Yue7541932022-01-28 10:21:24 +08001513#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001514
1515 /*
1516 * Try to fall back to default hash SHA1 if the client
1517 * hasn't provided any preferred signature-hash combinations.
1518 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001519 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001520 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1521 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001522#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001523 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1524 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001525#endif
1526#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001527 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1528 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001529#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001530 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001531 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001532
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001533 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1534 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1535 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001536
Gilles Peskine449bd832023-01-11 14:50:10 +01001537 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001538 }
1539
Jerry Yue7541932022-01-28 10:21:24 +08001540#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001541
Paul Bakker48916f92012-09-16 19:57:18 +00001542 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001543 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1544 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001545 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1546 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1547 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001548#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001549 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1550 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1551 "during renegotiation"));
1552 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1553 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1554 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001555 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001556#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001557 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001558 break;
1559 }
1560 }
1561
1562 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001563 * Renegotiation security checks
1564 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001565 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1566 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1567 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001568 handshake_failure = 1;
1569 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001570#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001571 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001572 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001573 renegotiation_info_seen == 0) {
1574 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001575 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001576 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1577 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1578 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1579 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001580 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001581 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1582 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1583 renegotiation_info_seen == 1) {
1584 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001585 handshake_failure = 1;
1586 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001587#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001588
Gilles Peskine449bd832023-01-11 14:50:10 +01001589 if (handshake_failure == 1) {
1590 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1591 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1592 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001593 }
Paul Bakker380da532012-04-18 16:10:25 +00001594
Paul Bakker41c83d32013-03-20 14:39:14 +01001595 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001596 * Server certification selection (after processing TLS extensions)
1597 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001598 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1599 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1600 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001601 }
Glenn Strauss69894072022-01-24 12:58:00 -05001602#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1603 ssl->handshake->sni_name = NULL;
1604 ssl->handshake->sni_name_len = 0;
1605#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001606
1607 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001608 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001609 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001610 * and certificate from the SNI callback triggered by the SNI extension
1611 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001612 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001613 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001614 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001615 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001616
Gilles Peskine449bd832023-01-11 14:50:10 +01001617 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1618 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1619 for (i = 0; ciphersuites[i] != 0; i++) {
1620 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001621 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001622 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001623
TRodziewicz8476f2f2021-06-02 14:34:47 +02001624 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001625
Gilles Peskine449bd832023-01-11 14:50:10 +01001626 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1627 &ciphersuite_info)) != 0) {
1628 return ret;
1629 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001630
Gilles Peskine449bd832023-01-11 14:50:10 +01001631 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001632 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001633 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001634 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001635 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001636 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001637 for (i = 0; ciphersuites[i] != 0; i++) {
1638 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1639 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001640 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001641 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001642
1643 got_common_suite = 1;
1644
Gilles Peskine449bd832023-01-11 14:50:10 +01001645 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1646 &ciphersuite_info)) != 0) {
1647 return ret;
1648 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001649
Gilles Peskine449bd832023-01-11 14:50:10 +01001650 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001651 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001652 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001653 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001654 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001655 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001656
Gilles Peskine449bd832023-01-11 14:50:10 +01001657 if (got_common_suite) {
1658 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1659 "but none of them usable"));
1660 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1661 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1662 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1663 } else {
1664 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1665 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1666 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1667 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001668 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001669
1670have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001671 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001672
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001673 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001674 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001675
Paul Bakker5121ce52009-01-03 21:22:43 +00001676 ssl->state++;
1677
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001678#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001679 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1680 mbedtls_ssl_recv_flight_completed(ssl);
1681 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001682#endif
1683
Hanno Becker7e5437a2017-04-28 17:15:26 +01001684 /* Debugging-only output for testsuite */
1685#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001686 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001687 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1688 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001689 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001690 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1691 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1692 sig_hash));
1693 } else {
1694 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1695 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001696 }
1697#endif
1698
Gilles Peskine449bd832023-01-11 14:50:10 +01001699 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001700
Gilles Peskine449bd832023-01-11 14:50:10 +01001701 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001702}
1703
Hanno Beckera0e20d02019-05-15 14:03:01 +01001704#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001705static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1706 unsigned char *buf,
1707 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001708{
1709 unsigned char *p = buf;
1710 size_t ext_len;
1711 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1712
1713 *olen = 0;
1714
1715 /* Skip writing the extension if we don't want to use it or if
1716 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001717 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001718 return;
1719 }
1720
Gilles Peskine449bd832023-01-11 14:50:10 +01001721 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1722 * which is at most 255, so the increment cannot overflow. */
1723 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1724 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1725 return;
1726 }
1727
1728 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001729
1730 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001731 * struct {
1732 * opaque cid<0..2^8-1>;
1733 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001734 */
1735 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001736 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001737 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001738 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001739 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001740
1741 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001742 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001743
1744 *olen = ssl->own_cid_len + 5;
1745}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001746#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001747
Neil Armstrong76b74072022-04-06 13:43:54 +02001748#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001749static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1750 unsigned char *buf,
1751 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001752{
1753 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001754 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001755
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001756 /*
1757 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1758 * from a client and then selects a stream or Authenticated Encryption
1759 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1760 * encrypt-then-MAC response extension back to the client."
1761 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001762 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001763 ssl->session_negotiate->ciphersuite);
1764 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001765 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001766 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001767 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001768 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001769 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001770 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001771
Gilles Peskine449bd832023-01-11 14:50:10 +01001772 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001773 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001774 }
Ronald Cron862902d2022-03-24 14:15:28 +01001775 }
1776
Gilles Peskine449bd832023-01-11 14:50:10 +01001777 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001778 *olen = 0;
1779 return;
1780 }
1781
Gilles Peskine449bd832023-01-11 14:50:10 +01001782 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001783
Gilles Peskine449bd832023-01-11 14:50:10 +01001784 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001785 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001786
1787 *p++ = 0x00;
1788 *p++ = 0x00;
1789
1790 *olen = 4;
1791}
Neil Armstrong76b74072022-04-06 13:43:54 +02001792#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001793
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001794#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001795static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1796 unsigned char *buf,
1797 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001798{
1799 unsigned char *p = buf;
1800
Gilles Peskine449bd832023-01-11 14:50:10 +01001801 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001802 *olen = 0;
1803 return;
1804 }
1805
Gilles Peskine449bd832023-01-11 14:50:10 +01001806 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1807 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001808
Gilles Peskine449bd832023-01-11 14:50:10 +01001809 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001810 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001811
1812 *p++ = 0x00;
1813 *p++ = 0x00;
1814
1815 *olen = 4;
1816}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001817#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001818
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001819#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001820static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1821 unsigned char *buf,
1822 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001823{
1824 unsigned char *p = buf;
1825
Gilles Peskine449bd832023-01-11 14:50:10 +01001826 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001827 *olen = 0;
1828 return;
1829 }
1830
Gilles Peskine449bd832023-01-11 14:50:10 +01001831 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001832
Gilles Peskine449bd832023-01-11 14:50:10 +01001833 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001834 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001835
1836 *p++ = 0x00;
1837 *p++ = 0x00;
1838
1839 *olen = 4;
1840}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001841#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001842
Gilles Peskine449bd832023-01-11 14:50:10 +01001843static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1844 unsigned char *buf,
1845 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001846{
1847 unsigned char *p = buf;
1848
Gilles Peskine449bd832023-01-11 14:50:10 +01001849 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001850 *olen = 0;
1851 return;
1852 }
1853
Gilles Peskine449bd832023-01-11 14:50:10 +01001854 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001855
Gilles Peskine449bd832023-01-11 14:50:10 +01001856 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001857 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001858
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001859#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001860 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001861 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001862 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001863 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001864
Gilles Peskine449bd832023-01-11 14:50:10 +01001865 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001866 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001867 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001868 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001869 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001870#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001871 {
1872 *p++ = 0x00;
1873 *p++ = 0x01;
1874 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001875 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001876
1877 *olen = p - buf;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001878}
1879
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001880#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001881static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1882 unsigned char *buf,
1883 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001884{
1885 unsigned char *p = buf;
1886
Gilles Peskine449bd832023-01-11 14:50:10 +01001887 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001888 *olen = 0;
1889 return;
1890 }
1891
Gilles Peskine449bd832023-01-11 14:50:10 +01001892 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001893
Gilles Peskine449bd832023-01-11 14:50:10 +01001894 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001895 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001896
1897 *p++ = 0x00;
1898 *p++ = 1;
1899
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001900 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001901
1902 *olen = 5;
1903}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001904#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001905
Valerio Setti7aeec542023-07-05 18:57:21 +02001906#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001907 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001908 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001909static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1910 unsigned char *buf,
1911 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001912{
1913 unsigned char *p = buf;
1914 ((void) ssl);
1915
Gilles Peskine449bd832023-01-11 14:50:10 +01001916 if ((ssl->handshake->cli_exts &
1917 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001918 *olen = 0;
1919 return;
1920 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001921
Gilles Peskine449bd832023-01-11 14:50:10 +01001922 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001923
Gilles Peskine449bd832023-01-11 14:50:10 +01001924 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001925 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001926
1927 *p++ = 0x00;
1928 *p++ = 2;
1929
1930 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001931 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001932
1933 *olen = 6;
1934}
Valerio Setti45d56f32023-07-13 17:23:20 +02001935#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001936 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001937 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001938
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001939#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001940static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1941 unsigned char *buf,
1942 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001943{
Janos Follath865b3eb2019-12-16 11:46:15 +00001944 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001945 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001946 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001947 size_t kkpp_len;
1948
1949 *olen = 0;
1950
1951 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001952 if (ssl->handshake->ciphersuite_info->key_exchange !=
1953 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001954 return;
1955 }
1956
Gilles Peskine449bd832023-01-11 14:50:10 +01001957 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1958
1959 if (end - p < 4) {
1960 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1961 return;
1962 }
1963
1964 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001965 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001966
Neil Armstrongca7d5062022-05-31 14:43:23 +02001967#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001968 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
1969 p + 2, end - p - 2, &kkpp_len,
1970 MBEDTLS_ECJPAKE_ROUND_ONE);
1971 if (ret != 0) {
1972 psa_destroy_key(ssl->handshake->psa_pake_password);
1973 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1974 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001975 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001976 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001977#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001978 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
1979 p + 2, end - p - 2, &kkpp_len,
1980 ssl->conf->f_rng, ssl->conf->p_rng);
1981 if (ret != 0) {
1982 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001983 return;
1984 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001985#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001986
Gilles Peskine449bd832023-01-11 14:50:10 +01001987 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001988 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001989
1990 *olen = kkpp_len + 4;
1991}
1992#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1993
Gilles Peskine449bd832023-01-11 14:50:10 +01001994#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1995static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1996 unsigned char *buf,
1997 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001998{
Ron Eldor75870ec2018-12-06 17:31:55 +02001999 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02002000 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02002001 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
2002
2003 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02002004
Gilles Peskine449bd832023-01-11 14:50:10 +01002005 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
2006 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01002007 return;
2008 }
2009
Gilles Peskine449bd832023-01-11 14:50:10 +01002010 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01002011
Gilles Peskine449bd832023-01-11 14:50:10 +01002012 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02002013 mki_len = ssl->dtls_srtp_info.mki_len;
2014 }
2015
Johan Pascal9bc97ca2020-09-21 23:44:45 +02002016 /* The extension total size is 9 bytes :
2017 * - 2 bytes for the extension tag
2018 * - 2 bytes for the total size
2019 * - 2 bytes for the protection profile length
2020 * - 2 bytes for the protection profile
2021 * - 1 byte for the mki length
2022 * + the actual mki length
2023 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01002024 if ((size_t) (end - buf) < mki_len + 9) {
2025 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02002026 return;
2027 }
2028
Johan Pascalb62bb512015-12-03 21:56:45 +01002029 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01002030 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03002031 /*
2032 * total length 5 and mki value: only one profile(2 bytes)
2033 * and length(2 bytes) and srtp_mki )
2034 */
Ron Eldor591f1622018-01-22 12:30:04 +02002035 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002036 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01002037
2038 /* protection profile length: 2 */
2039 buf[4] = 0x00;
2040 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02002041 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01002042 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2043 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2044 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
2045 } else {
2046 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02002047 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01002048 }
2049
Ron Eldor591f1622018-01-22 12:30:04 +02002050 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01002051 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01002052
Ron Eldor591f1622018-01-22 12:30:04 +02002053 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01002054}
2055#endif /* MBEDTLS_SSL_DTLS_SRTP */
2056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002057#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002058MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002059static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002060{
Janos Follath865b3eb2019-12-16 11:46:15 +00002061 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002062 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002063 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002064
Gilles Peskine449bd832023-01-11 14:50:10 +01002065 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002066
2067 /*
2068 * struct {
2069 * ProtocolVersion server_version;
2070 * opaque cookie<0..2^8-1>;
2071 * } HelloVerifyRequest;
2072 */
2073
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002074 /* The RFC is not clear on this point, but sending the actual negotiated
2075 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002076 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2077 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002078 p += 2;
2079
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002080 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002081 if (ssl->conf->f_cookie_write == NULL) {
2082 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2083 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002084 }
2085
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002086 /* Skip length byte until we know the length */
2087 cookie_len_byte = p++;
2088
Gilles Peskine449bd832023-01-11 14:50:10 +01002089 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2090 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2091 ssl->cli_id, ssl->cli_id_len)) != 0) {
2092 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2093 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002094 }
2095
Gilles Peskine449bd832023-01-11 14:50:10 +01002096 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002097
Gilles Peskine449bd832023-01-11 14:50:10 +01002098 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002099
2100 ssl->out_msglen = p - ssl->out_msg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002101 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2102 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002103
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002104 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002105
Gilles Peskine449bd832023-01-11 14:50:10 +01002106 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2107 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2108 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002109 }
2110
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002111#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002112 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2113 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2114 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2115 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002116 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002117#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002118
Gilles Peskine449bd832023-01-11 14:50:10 +01002119 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002120
Gilles Peskine449bd832023-01-11 14:50:10 +01002121 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002122}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002123#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002124
Gilles Peskine449bd832023-01-11 14:50:10 +01002125static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002126{
2127 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002128 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002129 mbedtls_ssl_session * const session = ssl->session_negotiate;
2130
2131 /* Resume is 0 by default, see ssl_handshake_init().
2132 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002133 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002134 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002135 }
2136 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002137 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002138 }
2139 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002140 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002141 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002142#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002143 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002144 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002145 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002146#endif
2147
Gilles Peskine449bd832023-01-11 14:50:10 +01002148 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002149
Gilles Peskine449bd832023-01-11 14:50:10 +01002150 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2151 session->id,
2152 session->id_len,
2153 &session_tmp);
2154 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002155 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002156 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002157
Gilles Peskine449bd832023-01-11 14:50:10 +01002158 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002159 /* Mismatch between cached and negotiated session */
2160 goto exit;
2161 }
2162
2163 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002164 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002165 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002166 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002167
Gilles Peskine449bd832023-01-11 14:50:10 +01002168 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002169 ssl->handshake->resume = 1;
2170
2171exit:
2172
Gilles Peskine449bd832023-01-11 14:50:10 +01002173 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002174}
2175
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002176MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002177static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002178{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002179#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002180 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002181#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002182 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002183 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002184 unsigned char *buf, *p;
2185
Gilles Peskine449bd832023-01-11 14:50:10 +01002186 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002187
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002188#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002189 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2190 ssl->handshake->cookie_verify_result != 0) {
2191 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2192 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002193
Gilles Peskine449bd832023-01-11 14:50:10 +01002194 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002195 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002196#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002197
Gilles Peskine449bd832023-01-11 14:50:10 +01002198 if (ssl->conf->f_rng == NULL) {
2199 MBEDTLS_SSL_DEBUG_MSG(1, ("no RNG provided"));
2200 return MBEDTLS_ERR_SSL_NO_RNG;
Paul Bakkera9a028e2013-11-21 17:31:06 +01002201 }
2202
Paul Bakker5121ce52009-01-03 21:22:43 +00002203 /*
2204 * 0 . 0 handshake type
2205 * 1 . 3 handshake length
2206 * 4 . 5 protocol version
2207 * 6 . 9 UNIX time()
2208 * 10 . 37 random bytes
2209 */
2210 buf = ssl->out_msg;
2211 p = buf + 4;
2212
Gilles Peskine449bd832023-01-11 14:50:10 +01002213 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002214 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002215
Gilles Peskine449bd832023-01-11 14:50:10 +01002216 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2217 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002218
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002219#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002220 t = mbedtls_time(NULL);
2221 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002222 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002223
Gilles Peskine449bd832023-01-11 14:50:10 +01002224 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2225 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002226#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002227 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2228 return ret;
2229 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002230
2231 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002232#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002233
Ronald Cronc5649382023-04-04 15:33:42 +02002234 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002235 return ret;
2236 }
Ronald Cronc5649382023-04-04 15:33:42 +02002237 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002238
Ronald Cronc5649382023-04-04 15:33:42 +02002239#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2240 /*
2241 * RFC 8446
2242 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2243 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2244 * response to a ClientHello MUST set the last 8 bytes of their Random
2245 * value specially in their ServerHello.
2246 */
2247 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2248 static const unsigned char magic_tls12_downgrade_string[] =
2249 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2250
2251 MBEDTLS_STATIC_ASSERT(
2252 sizeof(magic_tls12_downgrade_string) == 8,
2253 "magic_tls12_downgrade_string does not have the expected size");
2254
Ronald Cronfe01ec22023-04-06 09:56:53 +02002255 memcpy(p, magic_tls12_downgrade_string,
2256 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002257 } else
2258#endif
2259 {
2260 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2261 return ret;
2262 }
2263 }
2264 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002265
Gilles Peskine449bd832023-01-11 14:50:10 +01002266 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002267
Gilles Peskine449bd832023-01-11 14:50:10 +01002268 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002269
Gilles Peskine449bd832023-01-11 14:50:10 +01002270 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002271
Gilles Peskine449bd832023-01-11 14:50:10 +01002272 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002273 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002274 * New session, create a new session id,
2275 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002276 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002277 ssl->state++;
2278
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002279#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002280 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002281#endif
2282
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002283#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002284 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002285 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002286 memset(ssl->session_negotiate->id, 0, 32);
2287 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002288#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002289 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002290 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002291 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2292 n)) != 0) {
2293 return ret;
2294 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002295 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002296 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002297 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002298 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002299 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002300 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002301 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002302
Gilles Peskine449bd832023-01-11 14:50:10 +01002303 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2304 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2305 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002306 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002307 }
2308
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002309 /*
2310 * 38 . 38 session id length
2311 * 39 . 38+n session id
2312 * 39+n . 40+n chosen ciphersuite
2313 * 41+n . 41+n chosen compression alg.
2314 * 42+n . 43+n extensions length
2315 * 44+n . 43+n+m extensions
2316 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002317 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002318 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002319 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002320
Gilles Peskine449bd832023-01-11 14:50:10 +01002321 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2322 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2323 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2324 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002325
Gilles Peskine449bd832023-01-11 14:50:10 +01002326 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002327 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002328 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002329
Gilles Peskine449bd832023-01-11 14:50:10 +01002330 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2331 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2332 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2333 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002334
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002335 /*
2336 * First write extensions, then the total length
2337 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002338 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002339 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002340
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002341#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002342 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002343 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002344#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002345
Hanno Beckera0e20d02019-05-15 14:03:01 +01002346#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002347 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002348 ext_len += olen;
2349#endif
2350
Neil Armstrong76b74072022-04-06 13:43:54 +02002351#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002352 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002353 ext_len += olen;
2354#endif
2355
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002356#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002357 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002358 ext_len += olen;
2359#endif
2360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002361#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002362 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002363 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002364#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002365
Valerio Setti7aeec542023-07-05 18:57:21 +02002366#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002367 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002368 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002369 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002370 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2371 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2372 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002373 ext_len += olen;
2374 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002375#endif
2376
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002377#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002378 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002379 ext_len += olen;
2380#endif
2381
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002382#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002383 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002384 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2385 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002386 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002387 }
Paul Elliottf518f812022-07-11 12:36:20 +01002388
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002389 ext_len += olen;
2390#endif
2391
Johan Pascalb62bb512015-12-03 21:56:45 +01002392#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002393 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002394 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002395#endif
2396
Gilles Peskine449bd832023-01-11 14:50:10 +01002397 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2398 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002399
Gilles Peskine449bd832023-01-11 14:50:10 +01002400 if (ext_len > 0) {
2401 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002402 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002403 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002404
2405 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002406 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2407 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002408
Gilles Peskine449bd832023-01-11 14:50:10 +01002409 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002410
Gilles Peskine449bd832023-01-11 14:50:10 +01002411 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002412
Gilles Peskine449bd832023-01-11 14:50:10 +01002413 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002414}
2415
Gilles Peskineeccd8882020-03-10 12:19:08 +01002416#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002417MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002418static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002419{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002420 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002421 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002422
Gilles Peskine449bd832023-01-11 14:50:10 +01002423 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002424
Gilles Peskine449bd832023-01-11 14:50:10 +01002425 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2426 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002427 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002428 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002429 }
2430
Gilles Peskine449bd832023-01-11 14:50:10 +01002431 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2432 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002433}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002434#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002435MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002436static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002437{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002438 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002439 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002440 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002441 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002442 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002443 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002444 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002445 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002446 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002447
Gilles Peskine449bd832023-01-11 14:50:10 +01002448 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002449
2450 ssl->state++;
2451
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002452#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002453 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002454 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002455 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002456#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002457 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002458
Gilles Peskine449bd832023-01-11 14:50:10 +01002459 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2460 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2461 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2462 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002463 }
2464
2465 /*
2466 * 0 . 0 handshake type
2467 * 1 . 3 handshake length
2468 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002469 * 5 .. m-1 cert types
2470 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002471 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002472 * n .. n+1 length of all DNs
2473 * n+2 .. n+3 length of DN 1
2474 * n+4 .. ... Distinguished Name #1
2475 * ... .. ... length of DN 2, etc.
2476 */
2477 buf = ssl->out_msg;
2478 p = buf + 4;
2479
2480 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002481 * Supported certificate types
2482 *
2483 * ClientCertificateType certificate_types<1..2^8-1>;
2484 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002485 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002486 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002487
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002488#if defined(MBEDTLS_RSA_C)
2489 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002490#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002491#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002492 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002493#endif
2494
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002495 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002496 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002497
Paul Bakker577e0062013-08-28 11:57:20 +02002498 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002499
Paul Bakker926af752012-11-23 13:38:07 +01002500 /*
2501 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002502 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002503 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2504 *
2505 * struct {
2506 * HashAlgorithm hash;
2507 * SignatureAlgorithm signature;
2508 * } SignatureAndHashAlgorithm;
2509 *
2510 * enum { (255) } HashAlgorithm;
2511 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002512 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002513 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2514 if (sig_alg == NULL) {
2515 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2516 }
Ronald Cron8457c122022-03-07 11:32:54 +01002517
Gilles Peskine449bd832023-01-11 14:50:10 +01002518 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2519 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002520
Gilles Peskine449bd832023-01-11 14:50:10 +01002521 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002522 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002523 }
2524 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002525 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002526 }
Simon Butcher99000142016-10-13 17:21:01 +01002527
Paul Elliott96a0fd92022-11-08 17:09:56 +00002528 /* Write elements at offsets starting from 1 (offset 0 is for the
2529 * length). Thus the offset of each element is the length of the
2530 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002531 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002532 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002533
Paul Bakker926af752012-11-23 13:38:07 +01002534 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002535
Paul Elliott96a0fd92022-11-08 17:09:56 +00002536 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002537 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002538 sa_len += 2;
2539 p += sa_len;
2540
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002541 /*
2542 * DistinguishedName certificate_authorities<0..2^16-1>;
2543 * opaque DistinguishedName<1..2^16-1>;
2544 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002545 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002546
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002547 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002548
Gilles Peskine449bd832023-01-11 14:50:10 +01002549 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002550 /* NOTE: If trusted certificates are provisioned
2551 * via a CA callback (configured through
2552 * `mbedtls_ssl_conf_ca_cb()`, then the
2553 * CertificateRequest is currently left empty. */
2554
Glenn Strauss999ef702022-03-11 01:37:23 -05002555#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2556#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002557 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002558 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002559 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002560#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002561 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002562 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002563 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002564#endif
Janos Follath088ce432017-04-10 12:42:31 +01002565#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002566 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002567 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002568 } else
Janos Follath088ce432017-04-10 12:42:31 +01002569#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002570 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002571
Gilles Peskine449bd832023-01-11 14:50:10 +01002572 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002573 /* It follows from RFC 5280 A.1 that this length
2574 * can be represented in at most 11 bits. */
2575 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002576
Gilles Peskine449bd832023-01-11 14:50:10 +01002577 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2578 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002579 break;
2580 }
2581
Gilles Peskine449bd832023-01-11 14:50:10 +01002582 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002583 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002584 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002585 p += dn_size;
2586
Gilles Peskine449bd832023-01-11 14:50:10 +01002587 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002588
2589 total_dn_size += 2 + dn_size;
2590 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002591 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002592 }
2593
Paul Bakker926af752012-11-23 13:38:07 +01002594 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002595 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2596 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002597 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002598
Gilles Peskine449bd832023-01-11 14:50:10 +01002599 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002600
Gilles Peskine449bd832023-01-11 14:50:10 +01002601 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002602
Gilles Peskine449bd832023-01-11 14:50:10 +01002603 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002604}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002605#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002606
Valerio Setti4d0e8462023-10-06 13:20:21 +02002607#if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01002608 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Valerio Setti4d0e8462023-10-06 13:20:21 +02002609#if defined(MBEDTLS_USE_PSA_CRYPTO)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002610MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002611static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002612{
2613 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2614 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002615 mbedtls_pk_context *pk;
2616 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002617 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002618#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002619 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002620 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002621 size_t key_len;
Valerio Setti97207782023-05-18 18:59:06 +02002622 mbedtls_ecp_group_id grp_id;
Valerio Setti3589a4c2023-06-22 09:02:44 +02002623 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
Valerio Setti0813b6f2023-06-16 12:18:53 +02002624 mbedtls_ecp_keypair *key;
2625#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002626
Gilles Peskine449bd832023-01-11 14:50:10 +01002627 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002628
Gilles Peskine449bd832023-01-11 14:50:10 +01002629 if (pk == NULL) {
2630 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2631 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002632
Valerio Setti0813b6f2023-06-16 12:18:53 +02002633 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002634
Valerio Setti0813b6f2023-06-16 12:18:53 +02002635 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002636 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002637#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2638 case MBEDTLS_PK_ECKEY:
2639 case MBEDTLS_PK_ECKEY_DH:
2640 case MBEDTLS_PK_ECDSA:
2641#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002642 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2643 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2644 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002645
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002646 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
Neil Armstronge88d1902022-04-04 11:25:23 +02002647
Przemek Stekiel6f199852023-06-29 08:59:26 +02002648 /* Key should not be destroyed in the TLS library */
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002649 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Przemek Stekiel6f199852023-06-29 08:59:26 +02002650
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002651 status = psa_get_key_attributes(ssl->handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002652 &key_attributes);
2653 if (status != PSA_SUCCESS) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002654 ssl->handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002655 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002656 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002657
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002658 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002659 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002660
Gilles Peskine449bd832023-01-11 14:50:10 +01002661 psa_reset_key_attributes(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002662
Gilles Peskine449bd832023-01-11 14:50:10 +01002663 ret = 0;
2664 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002665#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002666 case MBEDTLS_PK_ECKEY:
2667 case MBEDTLS_PK_ECKEY_DH:
2668 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002669 key = mbedtls_pk_ec_rw(*pk);
Valerio Settid0405092023-05-24 13:16:40 +02002670 grp_id = mbedtls_pk_get_group_id(pk);
2671 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002672 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2673 }
Valerio Setti97207782023-05-18 18:59:06 +02002674 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002675 if (tls_id == 0) {
2676 /* This elliptic curve is not supported */
2677 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2678 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002679
Gilles Peskine449bd832023-01-11 14:50:10 +01002680 /* If the above conversion to TLS ID was fine, then also this one will
2681 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002682 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002683 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002684
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002685 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002686
Gilles Peskine449bd832023-01-11 14:50:10 +01002687 key_attributes = psa_key_attributes_init();
2688 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2689 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2690 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002691 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002692 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002693
Gilles Peskine449bd832023-01-11 14:50:10 +01002694 key_len = PSA_BITS_TO_BYTES(key->grp.pbits);
2695 ret = mbedtls_ecp_write_key(key, buf, key_len);
2696 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002697 mbedtls_platform_zeroize(buf, sizeof(buf));
2698 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002699 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002700
Gilles Peskine449bd832023-01-11 14:50:10 +01002701 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002702 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002703 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002704 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002705 mbedtls_platform_zeroize(buf, sizeof(buf));
2706 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002707 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002708
Valerio Setti6835b4a2023-06-22 09:06:31 +02002709 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002710 ret = 0;
2711 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002712#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002713 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002714 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002715 }
2716
Gilles Peskine449bd832023-01-11 14:50:10 +01002717 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002718}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002719#else /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002720MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002721static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002722{
Janos Follath865b3eb2019-12-16 11:46:15 +00002723 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002724
Gilles Peskine449bd832023-01-11 14:50:10 +01002725 const mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
2726 if (private_key == NULL) {
2727 MBEDTLS_SSL_DEBUG_MSG(1, ("got no server private key"));
2728 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Leonid Rozenboim28752702022-04-21 18:00:52 -07002729 }
2730
Gilles Peskine449bd832023-01-11 14:50:10 +01002731 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_ECKEY)) {
2732 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2733 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002734 }
2735
Gilles Peskine449bd832023-01-11 14:50:10 +01002736 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
Valerio Setti77a75682023-05-15 11:18:46 +02002737 mbedtls_pk_ec_ro(*mbedtls_ssl_own_key(ssl)),
Gilles Peskine449bd832023-01-11 14:50:10 +01002738 MBEDTLS_ECDH_OURS)) != 0) {
2739 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2740 return ret;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002741 }
2742
Gilles Peskine449bd832023-01-11 14:50:10 +01002743 return 0;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002744}
Valerio Setti4d0e8462023-10-06 13:20:21 +02002745#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002746#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2747 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002748
Gilles Peskineeccd8882020-03-10 12:19:08 +01002749#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002750 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002751MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002752static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2753 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002754{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002755 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2756 * signature length which will be added in ssl_write_server_key_exchange
2757 * after the call to ssl_prepare_server_key_exchange.
2758 * ssl_write_server_key_exchange also takes care of incrementing
2759 * ssl->out_msglen. */
2760 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002761 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2762 - sig_start);
2763 int ret = ssl->conf->f_async_resume(ssl,
2764 sig_start, signature_len, sig_max_len);
2765 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002766 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002767 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002768 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002769 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2770 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002771}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002772#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002773 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002774
Gilles Peskined3eb0612018-01-08 17:07:44 +01002775/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002776 * calculating the signature if any, but excluding formatting the
2777 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002778MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002779static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2780 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002781{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002782 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002783 ssl->handshake->ciphersuite_info;
2784
Gilles Peskineeccd8882020-03-10 12:19:08 +01002785#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002786#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002787 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002788#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002789#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002790
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002791 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002792#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002793 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002794#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002795
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002796#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002797#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002798 size_t out_buf_len = ssl->out_buf_len - (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002799#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002800 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN - (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002801#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002802#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002803
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002804 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002805
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002806 /*
2807 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002808 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002809 *
2810 */
2811
2812 /*
2813 * - ECJPAKE key exchanges
2814 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002815#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002816 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002817 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002818#if defined(MBEDTLS_USE_PSA_CRYPTO)
2819 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2820 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2821 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002822 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002823 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002824
Valerio Setti6f1b5742022-11-16 10:00:32 +01002825 /*
2826 * The first 3 bytes are:
2827 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2828 * [1, 2] elliptic curve's TLS ID
2829 *
2830 * However since we only support secp256r1 for now, we hardcode its
2831 * TLS ID here
2832 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002833 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002834 MBEDTLS_ECP_DP_SECP256R1);
2835 if (tls_id == 0) {
2836 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002837 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002838 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002839 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002840 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002841
Gilles Peskine449bd832023-01-11 14:50:10 +01002842 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2843 out_p + output_offset,
2844 end_p - out_p - output_offset, &output_len,
2845 MBEDTLS_ECJPAKE_ROUND_TWO);
2846 if (ret != 0) {
2847 psa_destroy_key(ssl->handshake->psa_pake_password);
2848 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2849 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2850 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002851 }
2852
Valerio Setti02c25b52022-11-15 14:08:42 +01002853 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002854 ssl->out_msglen += output_offset;
2855#else
Simon Butcher600c5e62018-06-14 08:58:59 +01002856 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002857
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002858 ret = mbedtls_ecjpake_write_round_two(
2859 &ssl->handshake->ecjpake_ctx,
2860 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10002861 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Gilles Peskine449bd832023-01-11 14:50:10 +01002862 ssl->conf->f_rng, ssl->conf->p_rng);
2863 if (ret != 0) {
2864 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2865 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002866 }
2867
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002868 ssl->out_msglen += len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002869#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002870 }
2871#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2872
Hanno Becker1aa267c2017-04-28 17:08:27 +01002873 /*
2874 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2875 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2876 * we use empty support identity hints here.
2877 **/
2878#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002879 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002880 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2881 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002882 ssl->out_msg[ssl->out_msglen++] = 0x00;
2883 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002884 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002885#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2886 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002887
Hanno Becker7e5437a2017-04-28 17:15:26 +01002888 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002889 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002890 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002891#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002892 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002893 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002894 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002895
Gilles Peskine449bd832023-01-11 14:50:10 +01002896 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2897 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2898 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002899 }
2900
Paul Bakker41c83d32013-03-20 14:39:14 +01002901 /*
2902 * Ephemeral DH parameters:
2903 *
2904 * struct {
2905 * opaque dh_p<1..2^16-1>;
2906 * opaque dh_g<1..2^16-1>;
2907 * opaque dh_Ys<1..2^16-1>;
2908 * } ServerDHParams;
2909 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002910 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2911 &ssl->conf->dhm_P,
2912 &ssl->conf->dhm_G)) != 0) {
2913 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2914 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002915 }
Paul Bakker48916f92012-09-16 19:57:18 +00002916
Gilles Peskine449bd832023-01-11 14:50:10 +01002917 if ((ret = mbedtls_dhm_make_params(
2918 &ssl->handshake->dhm_ctx,
2919 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2920 ssl->out_msg + ssl->out_msglen, &len,
2921 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2922 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2923 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002924 }
2925
Jerry Yuc5aef882021-12-23 20:15:02 +08002926#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002927 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002928#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002929
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002930 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002931
Gilles Peskine449bd832023-01-11 14:50:10 +01002932 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2933 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2934 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2935 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002936 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002937#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002938
Hanno Becker1aa267c2017-04-28 17:08:27 +01002939 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002940 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002941 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002942#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002943 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002944 /*
2945 * Ephemeral ECDH parameters:
2946 *
2947 * struct {
2948 * ECParameters curve_params;
2949 * ECPoint public;
2950 * } ServerECDHParams;
2951 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002952 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002953 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
Janos Follath865b3eb2019-12-16 11:46:15 +00002954 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002955 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002956
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002957 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002958 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2959 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2960 }
2961 for (; *group_list != 0; group_list++) {
2962 for (curr_tls_id = ssl->handshake->curves_tls_id;
2963 *curr_tls_id != 0; curr_tls_id++) {
2964 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002965 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002966 }
2967 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002968 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002969
Gilles Peskine449bd832023-01-11 14:50:10 +01002970curve_matching_done:
2971 if (*curr_tls_id == 0) {
2972 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2973 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2974 }
2975
2976 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2977 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002978
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002979#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrongd91526c2022-04-12 14:38:52 +02002980 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2981 psa_key_attributes_t key_attributes;
2982 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002983 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2984 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2985 // data length(1)
2986 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002987 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002988 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002989
Gilles Peskine449bd832023-01-11 14:50:10 +01002990 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002991
Valerio Setti40d9ca92023-01-04 16:08:04 +01002992 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002993 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002994 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002995 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2996 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2997 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002998 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002999 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02003000 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003001
3002 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01003003 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
3004 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003005 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02003006 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003007
3008 /*
3009 * ECParameters curve_params
3010 *
3011 * First byte is curve_type, always named_curve
3012 */
3013 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
3014
3015 /*
3016 * Next two bytes are the namedcurve value
3017 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003018 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003019 p += 2;
3020
3021 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003022 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003023 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003024 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003025 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003026 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
3027 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003028 }
3029
3030 /*
3031 * ECPoint public
3032 *
3033 * First byte is data length.
3034 * It will be filled later. p holds now the data length location.
3035 */
3036
3037 /* Export the public part of the ECDH private key from PSA.
3038 * Make one byte space for the length.
3039 */
3040 unsigned char *own_pubkey = p + data_length_size;
3041
Gilles Peskine449bd832023-01-11 14:50:10 +01003042 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
3043 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003044
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003045 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01003046 own_pubkey, own_pubkey_max_len,
3047 &len);
3048 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003049 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003050 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003051 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3052 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003053 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003054 }
3055
3056 /* Store the length of the exported public key. */
3057 *p = (uint8_t) len;
3058
3059 /* Determine full message length. */
3060 len += header_size;
3061#else
Valerio Setti18c9fed2022-12-30 17:44:24 +01003062 mbedtls_ecp_group_id curr_grp_id =
Gilles Peskine449bd832023-01-11 14:50:10 +01003063 mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
Valerio Setti18c9fed2022-12-30 17:44:24 +01003064
Gilles Peskine449bd832023-01-11 14:50:10 +01003065 if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
3066 curr_grp_id)) != 0) {
3067 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
3068 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003069 }
3070
Gilles Peskine449bd832023-01-11 14:50:10 +01003071 if ((ret = mbedtls_ecdh_make_params(
3072 &ssl->handshake->ecdh_ctx, &len,
3073 ssl->out_msg + ssl->out_msglen,
3074 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
3075 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3076 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
3077 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003078 }
3079
Gilles Peskine449bd832023-01-11 14:50:10 +01003080 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3081 MBEDTLS_DEBUG_ECDH_Q);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003082#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker41c83d32013-03-20 14:39:14 +01003083
Jerry Yuc5aef882021-12-23 20:15:02 +08003084#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003085 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003086#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003087
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003088 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01003089 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003090#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003091
Hanno Becker1aa267c2017-04-28 17:08:27 +01003092 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003093 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003094 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003095 * exchange parameters, compute and add the signature here.
3096 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003097 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003098#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003099 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3100 if (dig_signed == NULL) {
3101 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3102 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01003103 }
3104
Gilles Peskine1004c192018-01-08 16:59:14 +01003105 size_t dig_signed_len = ssl->out_msg + ssl->out_msglen - dig_signed;
Gilles Peskineca1d7422018-04-24 11:53:22 +02003106 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003107 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003108
Janos Follath865b3eb2019-12-16 11:46:15 +00003109 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003110
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003111 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003112 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003113 * For TLS 1.2, obey signature-hash-algorithm extension
3114 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003115 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003116
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003117 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003118 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003119
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003120 unsigned int sig_hash =
3121 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003122 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003123
Gilles Peskine449bd832023-01-11 14:50:10 +01003124 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003125
Ronald Cron8457c122022-03-07 11:32:54 +01003126 /* For TLS 1.2, obey signature-hash-algorithm extension
3127 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003128 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3129 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003130 /* (... because we choose a cipher suite
3131 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003132 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003133 }
3134
Gilles Peskine449bd832023-01-11 14:50:10 +01003135 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003136
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003137 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003138 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003139 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003140 if (md_alg != MBEDTLS_MD_NONE) {
3141 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3142 dig_signed,
3143 dig_signed_len,
3144 md_alg);
3145 if (ret != 0) {
3146 return ret;
3147 }
3148 } else {
3149 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3150 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003151 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003152
Gilles Peskine449bd832023-01-11 14:50:10 +01003153 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003154
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003155 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003156 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003157 */
Ronald Cron8457c122022-03-07 11:32:54 +01003158 /*
3159 * We need to specify signature and hash algorithm explicitly through
3160 * a prefix to the signature.
3161 *
3162 * struct {
3163 * HashAlgorithm hash;
3164 * SignatureAlgorithm signature;
3165 * } SignatureAndHashAlgorithm;
3166 *
3167 * struct {
3168 * SignatureAndHashAlgorithm algorithm;
3169 * opaque signature<0..2^16-1>;
3170 * } DigitallySigned;
3171 *
3172 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003173
Gilles Peskine449bd832023-01-11 14:50:10 +01003174 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3175 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003176
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003177#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003178 if (ssl->conf->f_async_sign_start != NULL) {
3179 ret = ssl->conf->f_async_sign_start(ssl,
3180 mbedtls_ssl_own_cert(ssl),
3181 md_alg, hash, hashlen);
3182 switch (ret) {
3183 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3184 /* act as if f_async_sign was null */
3185 break;
3186 case 0:
3187 ssl->handshake->async_in_progress = 1;
3188 return ssl_resume_server_key_exchange(ssl, signature_len);
3189 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3190 ssl->handshake->async_in_progress = 1;
3191 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3192 default:
3193 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3194 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003195 }
3196 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003197#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003198
Gilles Peskine449bd832023-01-11 14:50:10 +01003199 if (mbedtls_ssl_own_key(ssl) == NULL) {
3200 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3201 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003202 }
3203
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003204 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3205 * signature length which will be added in ssl_write_server_key_exchange
3206 * after the call to ssl_prepare_server_key_exchange.
3207 * ssl_write_server_key_exchange also takes care of incrementing
3208 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003209 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3210 md_alg, hash, hashlen,
3211 ssl->out_msg + ssl->out_msglen + 2,
3212 out_buf_len - ssl->out_msglen - 2,
3213 signature_len,
3214 ssl->conf->f_rng,
3215 ssl->conf->p_rng)) != 0) {
3216 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3217 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003218 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003219 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003220#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003221
Gilles Peskine449bd832023-01-11 14:50:10 +01003222 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003223}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003224
Gilles Peskined3eb0612018-01-08 17:07:44 +01003225/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003226 * that do not include a ServerKeyExchange message, do nothing. Either
3227 * way, if successful, move on to the next step in the SSL state
3228 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003229MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003230static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003231{
Janos Follath865b3eb2019-12-16 11:46:15 +00003232 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003233 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003234#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003235 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003236 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003237#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003238
Gilles Peskine449bd832023-01-11 14:50:10 +01003239 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003240
Gilles Peskineeccd8882020-03-10 12:19:08 +01003241#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003242 /* Extract static ECDH parameters and abort if ServerKeyExchange
3243 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003244 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003245 /* For suites involving ECDH, extract DH parameters
3246 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003247#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003248 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3249 ret = ssl_get_ecdh_params_from_cert(ssl);
3250 if (ret != 0) {
3251 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3252 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003253 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003254 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003255#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003256
3257 /* Key exchanges not involving ephemeral keys don't use
3258 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003259 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003260 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003261 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003262 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003263#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003264
Gilles Peskineeccd8882020-03-10 12:19:08 +01003265#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003266 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003267 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003268 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003269 if (ssl->handshake->async_in_progress != 0) {
3270 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3271 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3272 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003273#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003274 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003275 {
3276 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003277 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003278 }
3279
Gilles Peskine449bd832023-01-11 14:50:10 +01003280 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003281 /* If we're starting to write a new message, set ssl->out_msglen
3282 * to 0. But if we're resuming after an asynchronous message,
3283 * out_msglen is the amount of data written so far and mst be
3284 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003285 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3286 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3287 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003288 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003289 }
3290 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003291 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003292
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003293 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003294 * ssl_prepare_server_key_exchange already wrote the signature
3295 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003296#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003297 if (signature_len != 0) {
3298 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3299 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003300
Gilles Peskine449bd832023-01-11 14:50:10 +01003301 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3302 ssl->out_msg + ssl->out_msglen,
3303 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003304
3305 /* Skip over the already-written signature */
3306 ssl->out_msglen += signature_len;
3307 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003308#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003309
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003310 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003311 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3312 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003313
3314 ssl->state++;
3315
Gilles Peskine449bd832023-01-11 14:50:10 +01003316 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3317 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3318 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003319 }
3320
Gilles Peskine449bd832023-01-11 14:50:10 +01003321 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3322 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003323}
3324
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003325MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003326static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003327{
Janos Follath865b3eb2019-12-16 11:46:15 +00003328 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003329
Gilles Peskine449bd832023-01-11 14:50:10 +01003330 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003331
3332 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003333 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3334 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003335
3336 ssl->state++;
3337
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003338#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003339 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3340 mbedtls_ssl_send_flight_completed(ssl);
3341 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003342#endif
3343
Gilles Peskine449bd832023-01-11 14:50:10 +01003344 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3345 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3346 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003347 }
3348
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003349#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003350 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3351 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3352 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3353 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003354 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003355#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003356
Gilles Peskine449bd832023-01-11 14:50:10 +01003357 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003358
Gilles Peskine449bd832023-01-11 14:50:10 +01003359 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003360}
3361
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003362#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3363 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003364MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003365static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3366 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003367{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003368 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003369 size_t n;
3370
3371 /*
3372 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3373 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003374 if (*p + 2 > end) {
3375 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3376 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003377 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003378
Gilles Peskine449bd832023-01-11 14:50:10 +01003379 n = ((*p)[0] << 8) | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003380 *p += 2;
3381
Gilles Peskine449bd832023-01-11 14:50:10 +01003382 if (*p + n > end) {
3383 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3384 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003385 }
3386
Gilles Peskine449bd832023-01-11 14:50:10 +01003387 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3388 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3389 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003390 }
3391
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003392 *p += n;
3393
Gilles Peskine449bd832023-01-11 14:50:10 +01003394 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003395
Gilles Peskine449bd832023-01-11 14:50:10 +01003396 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003397}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003398#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3399 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003400
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003401#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3402 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003403
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003404#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003405MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003406static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3407 unsigned char *peer_pms,
3408 size_t *peer_pmslen,
3409 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003410{
Gilles Peskine449bd832023-01-11 14:50:10 +01003411 int ret = ssl->conf->f_async_resume(ssl,
3412 peer_pms, peer_pmslen, peer_pmssize);
3413 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003414 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003415 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003416 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003417 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3418 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003419}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003420#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003421
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003422MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003423static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3424 const unsigned char *p,
3425 const unsigned char *end,
3426 unsigned char *peer_pms,
3427 size_t *peer_pmslen,
3428 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003429{
Janos Follath865b3eb2019-12-16 11:46:15 +00003430 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003431
Gilles Peskine449bd832023-01-11 14:50:10 +01003432 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3433 if (own_cert == NULL) {
3434 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3435 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003436 }
3437 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003438 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3439 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003440
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003441#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003442 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003443 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003444 if (ssl->handshake->async_in_progress != 0) {
3445 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3446 return ssl_resume_decrypt_pms(ssl,
3447 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003448 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003449#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003450
3451 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003452 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003453 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003454 if (p + 2 > end) {
3455 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3456 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003457 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003458 if (*p++ != MBEDTLS_BYTE_1(len) ||
3459 *p++ != MBEDTLS_BYTE_0(len)) {
3460 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3461 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003462 }
3463
Gilles Peskine449bd832023-01-11 14:50:10 +01003464 if (p + len != end) {
3465 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3466 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003467 }
3468
Gilles Peskine422ccab2018-01-11 18:29:01 +01003469 /*
3470 * Decrypt the premaster secret
3471 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003472#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003473 if (ssl->conf->f_async_decrypt_start != NULL) {
3474 ret = ssl->conf->f_async_decrypt_start(ssl,
3475 mbedtls_ssl_own_cert(ssl),
3476 p, len);
3477 switch (ret) {
3478 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3479 /* act as if f_async_decrypt_start was null */
3480 break;
3481 case 0:
3482 ssl->handshake->async_in_progress = 1;
3483 return ssl_resume_decrypt_pms(ssl,
3484 peer_pms,
3485 peer_pmslen,
3486 peer_pmssize);
3487 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3488 ssl->handshake->async_in_progress = 1;
3489 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3490 default:
3491 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3492 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003493 }
3494 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003495#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003496
Gilles Peskine449bd832023-01-11 14:50:10 +01003497 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3498 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3499 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003500 }
3501
Gilles Peskine449bd832023-01-11 14:50:10 +01003502 ret = mbedtls_pk_decrypt(private_key, p, len,
3503 peer_pms, peer_pmslen, peer_pmssize,
3504 ssl->conf->f_rng, ssl->conf->p_rng);
3505 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003506}
3507
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003508MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003509static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3510 const unsigned char *p,
3511 const unsigned char *end,
3512 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003513{
Janos Follath865b3eb2019-12-16 11:46:15 +00003514 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003515 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3516 unsigned char ver[2];
3517 unsigned char fake_pms[48], peer_pms[48];
Dave Rodgman293eedd2023-05-17 12:31:36 +01003518 size_t peer_pmslen;
3519 mbedtls_ct_condition_t diff;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003520
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003521 /* In case of a failure in decryption, the decryption may write less than
3522 * 2 bytes of output, but we always read the first two bytes. It doesn't
3523 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003524 * ret being nonzero, and we only care whether diff is 0.
3525 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3526 * also makes memory analyzers happy (don't access uninitialized memory,
3527 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003528 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003529 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003530
Gilles Peskine449bd832023-01-11 14:50:10 +01003531 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3532 peer_pms,
3533 &peer_pmslen,
3534 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003535
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003536#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003537 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3538 return ret;
3539 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003540#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003541
Gilles Peskine449bd832023-01-11 14:50:10 +01003542 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3543 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003544
3545 /* Avoid data-dependent branches while checking for invalid
3546 * padding, to protect against timing-based Bleichenbacher-type
3547 * attacks. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003548 diff = mbedtls_ct_bool(ret);
Dave Rodgmanb7825ce2023-08-10 11:58:18 +01003549 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pmslen, 48));
3550 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[0], ver[0]));
3551 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[1], ver[1]));
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003552
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003553 /*
3554 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3555 * must not cause the connection to end immediately; instead, send a
3556 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003557 * To protect against timing-based variants of the attack, we must
3558 * not have any branch that depends on whether the decryption was
3559 * successful. In particular, always generate the fake premaster secret,
3560 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003561 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003562 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3563 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003564 /* It's ok to abort on an RNG failure, since this does not reveal
3565 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003566 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003567 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003568
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003569#if defined(MBEDTLS_SSL_DEBUG_ALL)
Dave Rodgman293eedd2023-05-17 12:31:36 +01003570 if (diff != MBEDTLS_CT_FALSE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003571 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3572 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003573#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003574
Gilles Peskine449bd832023-01-11 14:50:10 +01003575 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3576 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3577 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3578 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003579 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003580 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003581
Gilles Peskine422ccab2018-01-11 18:29:01 +01003582 /* Set pms to either the true or the fake PMS, without
3583 * data-dependent branches. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003584 mbedtls_ct_memcpy_if(diff, pms, fake_pms, peer_pms, ssl->handshake->pmslen);
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003585
Gilles Peskine449bd832023-01-11 14:50:10 +01003586 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003587}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003588#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
3589 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003590
Gilles Peskineeccd8882020-03-10 12:19:08 +01003591#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003592MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003593static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3594 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003595{
Paul Bakker6db455e2013-09-18 17:29:31 +02003596 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003597 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003598
Gilles Peskine449bd832023-01-11 14:50:10 +01003599 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3600 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3601 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003602 }
3603
3604 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003605 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003606 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003607 if (end - *p < 2) {
3608 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3609 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003610 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003611
Gilles Peskine449bd832023-01-11 14:50:10 +01003612 n = ((*p)[0] << 8) | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003613 *p += 2;
3614
Gilles Peskine449bd832023-01-11 14:50:10 +01003615 if (n == 0 || n > end - *p) {
3616 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3617 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003618 }
3619
Gilles Peskine449bd832023-01-11 14:50:10 +01003620 if (ssl->conf->f_psk != NULL) {
3621 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003622 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003623 }
3624 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003625 /* Identity is not a big secret since clients send it in the clear,
3626 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003627 if (n != ssl->conf->psk_identity_len ||
3628 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003629 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003630 }
3631 }
3632
Gilles Peskine449bd832023-01-11 14:50:10 +01003633 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3634 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3635 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3636 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3637 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003638 }
3639
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003640 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003641
Gilles Peskine449bd832023-01-11 14:50:10 +01003642 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003643}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003644#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003645
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003646MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003647static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003648{
Janos Follath865b3eb2019-12-16 11:46:15 +00003649 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003650 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003651 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003652
Hanno Beckere694c3e2017-12-27 21:34:08 +00003653 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003654
Gilles Peskine449bd832023-01-11 14:50:10 +01003655 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003656
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003657#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskine449bd832023-01-11 14:50:10 +01003658 (defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3659 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED))
3660 if ((ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3661 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) &&
3662 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003663 /* We've already read a record and there is an asynchronous
3664 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003665 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003666 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3667 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003668#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003669 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3670 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3671 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003672 }
3673
Gilles Peskine449bd832023-01-11 14:50:10 +01003674 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003675 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003676
Gilles Peskine449bd832023-01-11 14:50:10 +01003677 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3678 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3679 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003680 }
3681
Gilles Peskine449bd832023-01-11 14:50:10 +01003682 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3683 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3684 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003685 }
3686
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003687#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003688 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3689 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3690 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3691 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003692 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003693
Gilles Peskine449bd832023-01-11 14:50:10 +01003694 if (p != end) {
3695 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3696 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003697 }
3698
Gilles Peskine449bd832023-01-11 14:50:10 +01003699 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3700 ssl->handshake->premaster,
3701 MBEDTLS_PREMASTER_SIZE,
3702 &ssl->handshake->pmslen,
3703 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3704 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3705 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003706 }
3707
Gilles Peskine449bd832023-01-11 14:50:10 +01003708 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3709 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003710#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003711#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3712 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3713 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3714 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003715 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003716 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3717 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003718 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003719#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003720 size_t data_len = (size_t) (*p++);
3721 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003722 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3723 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3724
Gilles Peskine449bd832023-01-11 14:50:10 +01003725 MBEDTLS_SSL_DEBUG_MSG(1, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003726
3727 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003728 * We must have at least two bytes (1 for length, at least 1 for data)
3729 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003730 if (buf_len < 2) {
3731 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length"));
3732 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003733 }
3734
Gilles Peskine449bd832023-01-11 14:50:10 +01003735 if (data_len < 1 || data_len > buf_len) {
3736 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length"));
3737 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003738 }
3739
3740 /* Store peer's ECDH public key. */
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003741 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3742 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003743
3744 /* Compute ECDH shared secret. */
3745 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003746 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3747 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003748 handshake->premaster, sizeof(handshake->premaster),
3749 &handshake->pmslen);
3750 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003751 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003752 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003753 if (handshake->xxdh_psa_privkey_is_external == 0) {
3754 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003755 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003756 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003757 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003758 }
3759
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003760 if (handshake->xxdh_psa_privkey_is_external == 0) {
3761 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003762
Gilles Peskine449bd832023-01-11 14:50:10 +01003763 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003764 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003765 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3766 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003767 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003768 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003769 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003770#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003771 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
3772 p, end - p)) != 0) {
3773 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3774 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003775 }
3776
Gilles Peskine449bd832023-01-11 14:50:10 +01003777 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3778 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003779
Gilles Peskine449bd832023-01-11 14:50:10 +01003780 if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
3781 &ssl->handshake->pmslen,
3782 ssl->handshake->premaster,
3783 MBEDTLS_MPI_MAX_SIZE,
3784 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3785 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3786 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003787 }
3788
Gilles Peskine449bd832023-01-11 14:50:10 +01003789 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3790 MBEDTLS_DEBUG_ECDH_Z);
Neil Armstrong913b3642022-04-13 14:59:48 +02003791#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003792 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003793#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3794 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3795 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3796 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3797#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003798 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3799 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3800 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3801 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003802 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003803
Gilles Peskine449bd832023-01-11 14:50:10 +01003804 if (p != end) {
3805 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3806 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003807 }
3808
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003809#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003810 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003811 (mbedtls_key_exchange_type_t) ciphersuite_info->
3812 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003813 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3814 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003815 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003816#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003817 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003818#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
3819#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003820 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003821#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003822 if (ssl->handshake->async_in_progress != 0) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003823 /* There is an asynchronous operation in progress to
3824 * decrypt the encrypted premaster secret, so skip
3825 * directly to resuming this operation. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003826 MBEDTLS_SSL_DEBUG_MSG(3, ("PSK identity already parsed"));
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003827 /* Update p to skip the PSK identity. ssl_parse_encrypted_pms
3828 * won't actually use it, but maintain p anyway for robustness. */
3829 p += ssl->conf->psk_identity_len + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01003830 } else
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003831#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003832 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3833 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3834 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003835 }
3836
Gilles Peskine449bd832023-01-11 14:50:10 +01003837 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 2)) != 0) {
3838 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_encrypted_pms"), ret);
3839 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003840 }
3841
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003842#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003843 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003844 (mbedtls_key_exchange_type_t) ciphersuite_info->
3845 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003846 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3847 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003848 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003849#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003850 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003851#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3852#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003853 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3854 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3855 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3856 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003857 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003858 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3859 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3860 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003861 }
3862
Gilles Peskine449bd832023-01-11 14:50:10 +01003863 if (p != end) {
3864 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3865 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003866 }
3867
Neil Armstrong80f6f322022-05-03 17:56:38 +02003868#if defined(MBEDTLS_USE_PSA_CRYPTO)
3869 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003870 unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003871 size_t pms_len;
3872
3873 /* Write length only when we know the actual value */
Gilles Peskine449bd832023-01-11 14:50:10 +01003874 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3875 pms + 2, pms_end - (pms + 2), &pms_len,
3876 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3877 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3878 return ret;
Neil Armstrong80f6f322022-05-03 17:56:38 +02003879 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003880 MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003881 pms += 2 + pms_len;
3882
Gilles Peskine449bd832023-01-11 14:50:10 +01003883 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003884#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003885 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003886 (mbedtls_key_exchange_type_t) ciphersuite_info->
3887 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003888 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3889 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003890 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003891#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003892 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003893#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003894#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003895 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003896#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrong039db292022-03-09 11:38:34 +01003897 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3898 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
3899 uint8_t ecpoint_len;
3900
3901 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3902
Gilles Peskine449bd832023-01-11 14:50:10 +01003903 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3904 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003905 psa_destroy_key(handshake->xxdh_psa_privkey);
3906 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003907 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003908 }
3909
3910 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003911 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003912 psa_destroy_key(handshake->xxdh_psa_privkey);
3913 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003914 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003915 }
3916
Neil Armstrong039db292022-03-09 11:38:34 +01003917 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003918 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003919 psa_destroy_key(handshake->xxdh_psa_privkey);
3920 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003921 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003922 }
3923
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003924 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3925 the sizes of the FFDH keys which are at least 2048 bits.
3926 The size of the array is thus greater than 256 bytes which is greater than any
3927 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003928#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003929 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3930 psa_destroy_key(handshake->xxdh_psa_privkey);
3931 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003932 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003933 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003934#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003935 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3936 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003937#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003938
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003939 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3940 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003941 p += ecpoint_len;
3942
Neil Armstrong3bcef082022-03-23 18:16:54 +01003943 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003944 * - a uint16 containing the length (in octets) of the ECDH computation
3945 * - the octet string produced by the ECDH computation
3946 * - a uint16 containing the length (in octets) of the PSK
3947 * - the PSK itself
3948 */
Neil Armstrong039db292022-03-09 11:38:34 +01003949 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003950 const unsigned char * const psm_end =
3951 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003952 /* uint16 to store length (in octets) of the ECDH computation */
3953 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003954 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003955
3956 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003957 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003958 handshake->xxdh_psa_privkey,
3959 handshake->xxdh_psa_peerkey,
3960 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003961 psm + zlen_size,
3962 psm_end - (psm + zlen_size),
3963 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003964
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003965 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3966 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003967
Gilles Peskine449bd832023-01-11 14:50:10 +01003968 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003969 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003970 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003971 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003972 }
Neil Armstrong039db292022-03-09 11:38:34 +01003973
Neil Armstrong3bcef082022-03-23 18:16:54 +01003974 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003975 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003976 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003977
Przemek Stekiel14d11b02022-04-14 08:33:29 +02003978#else /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003979 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3980 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3981 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003982 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003983
Gilles Peskine449bd832023-01-11 14:50:10 +01003984 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
3985 p, end - p)) != 0) {
3986 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3987 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003988 }
3989
Gilles Peskine449bd832023-01-11 14:50:10 +01003990 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3991 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003992
Gilles Peskine449bd832023-01-11 14:50:10 +01003993 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003994 (mbedtls_key_exchange_type_t) ciphersuite_info->
3995 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003996 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3997 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003998 }
Neil Armstrong913b3642022-04-13 14:59:48 +02003999#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004000 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004001#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
4002#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004003 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
4004 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
4005 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
4006 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004007 }
Gilles Peskine449bd832023-01-11 14:50:10 +01004008 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004009#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004010#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004011 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Neil Armstrongca7d5062022-05-31 14:43:23 +02004012#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01004013 if ((ret = mbedtls_psa_ecjpake_read_round(
4014 &ssl->handshake->psa_pake_ctx, p, end - p,
4015 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
4016 psa_destroy_key(ssl->handshake->psa_pake_password);
4017 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02004018
Gilles Peskine449bd832023-01-11 14:50:10 +01004019 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
4020 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02004021 }
4022#else
Gilles Peskine449bd832023-01-11 14:50:10 +01004023 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
4024 p, end - p);
4025 if (ret != 0) {
4026 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
4027 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004028 }
4029
Gilles Peskine449bd832023-01-11 14:50:10 +01004030 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
4031 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
4032 ssl->conf->f_rng, ssl->conf->p_rng);
4033 if (ret != 0) {
4034 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
4035 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004036 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02004037#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004038 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004039#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004040 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004041 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4042 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004043 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004044
Gilles Peskine449bd832023-01-11 14:50:10 +01004045 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
4046 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
4047 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00004048 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004049
Paul Bakker5121ce52009-01-03 21:22:43 +00004050 ssl->state++;
4051
Gilles Peskine449bd832023-01-11 14:50:10 +01004052 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004053
Gilles Peskine449bd832023-01-11 14:50:10 +01004054 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00004055}
4056
Gilles Peskineeccd8882020-03-10 12:19:08 +01004057#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004058MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004059static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004060{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004061 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004062 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00004063
Gilles Peskine449bd832023-01-11 14:50:10 +01004064 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004065
Gilles Peskine449bd832023-01-11 14:50:10 +01004066 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4067 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02004068 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004069 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02004070 }
4071
Gilles Peskine449bd832023-01-11 14:50:10 +01004072 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4073 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004074}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004075#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004076MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004077static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004078{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004079 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004080 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004081 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004082 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004083 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004084 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004085 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004086 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004087 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01004088 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004089
Gilles Peskine449bd832023-01-11 14:50:10 +01004090 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004091
Gilles Peskine449bd832023-01-11 14:50:10 +01004092 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4093 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004094 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004095 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004096 }
4097
Hanno Becker2a831a42019-02-07 13:17:25 +00004098#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01004099 if (ssl->session_negotiate->peer_cert == NULL) {
4100 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004101 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004102 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004103 }
4104#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004105 if (ssl->session_negotiate->peer_cert_digest == NULL) {
4106 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004107 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004108 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004109 }
4110#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4111
Simon Butcher99000142016-10-13 17:21:01 +01004112 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01004113 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
4114 if (0 != ret) {
4115 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
4116 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004117 }
4118
4119 ssl->state++;
4120
Simon Butcher99000142016-10-13 17:21:01 +01004121 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01004122 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4123 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
4124 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4125 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00004126 }
4127
Gilles Peskine449bd832023-01-11 14:50:10 +01004128 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004129
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004130#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4131 peer_pk = &ssl->handshake->peer_pubkey;
4132#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004133 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004134 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01004135 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004136 }
4137 peer_pk = &ssl->session_negotiate->peer_cert->pk;
4138#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4139
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004140 /*
4141 * struct {
4142 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4143 * opaque signature<0..2^16-1>;
4144 * } DigitallySigned;
4145 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004146 if (i + 2 > ssl->in_hslen) {
4147 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4148 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01004149 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004150
Ronald Cron8457c122022-03-07 11:32:54 +01004151 /*
4152 * Hash
4153 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004154 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01004155
Gilles Peskine449bd832023-01-11 14:50:10 +01004156 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
4157 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4158 " for verify message"));
4159 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004160 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004161
Simon Butcher99000142016-10-13 17:21:01 +01004162#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01004163 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01004164 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01004165 }
Simon Butcher99000142016-10-13 17:21:01 +01004166#endif
Paul Bakker926af752012-11-23 13:38:07 +01004167
Ronald Cron8457c122022-03-07 11:32:54 +01004168 /* Info from md_alg will be used instead */
4169 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004170
Ronald Cron8457c122022-03-07 11:32:54 +01004171 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004172
Ronald Cron8457c122022-03-07 11:32:54 +01004173 /*
4174 * Signature
4175 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004176 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
4177 == MBEDTLS_PK_NONE) {
4178 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4179 " for verify message"));
4180 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004181 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004182
Ronald Cron8457c122022-03-07 11:32:54 +01004183 /*
4184 * Check the certificate's key type matches the signature alg
4185 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004186 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
4187 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
4188 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004189 }
4190
4191 i++;
4192
Gilles Peskine449bd832023-01-11 14:50:10 +01004193 if (i + 2 > ssl->in_hslen) {
4194 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4195 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004196 }
4197
Gilles Peskine449bd832023-01-11 14:50:10 +01004198 sig_len = (ssl->in_msg[i] << 8) | ssl->in_msg[i+1];
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004199 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004200
Gilles Peskine449bd832023-01-11 14:50:10 +01004201 if (i + sig_len != ssl->in_hslen) {
4202 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4203 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00004204 }
4205
Simon Butcher99000142016-10-13 17:21:01 +01004206 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004207 {
4208 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004209 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
4210 if (0 != ret) {
4211 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
4212 return ret;
4213 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004214 }
Simon Butcher99000142016-10-13 17:21:01 +01004215
Gilles Peskine449bd832023-01-11 14:50:10 +01004216 if ((ret = mbedtls_pk_verify(peer_pk,
4217 md_alg, hash_start, hashlen,
4218 ssl->in_msg + i, sig_len)) != 0) {
4219 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
4220 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004221 }
4222
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004223 ret = mbedtls_ssl_update_handshake_status(ssl);
4224 if (0 != ret) {
4225 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
4226 return ret;
4227 }
Simon Butcher99000142016-10-13 17:21:01 +01004228
Gilles Peskine449bd832023-01-11 14:50:10 +01004229 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004230
Gilles Peskine449bd832023-01-11 14:50:10 +01004231 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004232}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004233#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004234
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004235#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004236MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004237static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004238{
Janos Follath865b3eb2019-12-16 11:46:15 +00004239 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004240 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004241 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004242
Gilles Peskine449bd832023-01-11 14:50:10 +01004243 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004244
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004245 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4246 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004247
4248 /*
4249 * struct {
4250 * uint32 ticket_lifetime_hint;
4251 * opaque ticket<0..2^16-1>;
4252 * } NewSessionTicket;
4253 *
4254 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4255 * 8 . 9 ticket_len (n)
4256 * 10 . 9+n ticket content
4257 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004258
Gilles Peskine449bd832023-01-11 14:50:10 +01004259 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4260 ssl->session_negotiate,
4261 ssl->out_msg + 10,
4262 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4263 &tlen, &lifetime)) != 0) {
4264 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004265 tlen = 0;
4266 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004267
Gilles Peskine449bd832023-01-11 14:50:10 +01004268 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4269 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004270 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004271
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004272 /*
4273 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4274 * ChangeCipherSpec share the same state.
4275 */
4276 ssl->handshake->new_session_ticket = 0;
4277
Gilles Peskine449bd832023-01-11 14:50:10 +01004278 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4279 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4280 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004281 }
4282
Gilles Peskine449bd832023-01-11 14:50:10 +01004283 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004284
Gilles Peskine449bd832023-01-11 14:50:10 +01004285 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004286}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004287#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004288
Paul Bakker5121ce52009-01-03 21:22:43 +00004289/*
Paul Bakker1961b702013-01-25 14:49:24 +01004290 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004291 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004292int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004293{
4294 int ret = 0;
4295
Gilles Peskine449bd832023-01-11 14:50:10 +01004296 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004297
Gilles Peskine449bd832023-01-11 14:50:10 +01004298 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004299 case MBEDTLS_SSL_HELLO_REQUEST:
4300 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004301 break;
4302
Paul Bakker1961b702013-01-25 14:49:24 +01004303 /*
4304 * <== ClientHello
4305 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004306 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004307 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004308 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004309
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004310#if defined(MBEDTLS_SSL_PROTO_DTLS)
4311 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004312 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004313#endif
4314
Paul Bakker1961b702013-01-25 14:49:24 +01004315 /*
4316 * ==> ServerHello
4317 * Certificate
4318 * ( ServerKeyExchange )
4319 * ( CertificateRequest )
4320 * ServerHelloDone
4321 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004322 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004323 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004324 break;
4325
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004326 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004327 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004328 break;
4329
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004330 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004331 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004332 break;
4333
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004334 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004335 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004336 break;
4337
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004338 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004339 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004340 break;
4341
4342 /*
4343 * <== ( Certificate/Alert )
4344 * ClientKeyExchange
4345 * ( CertificateVerify )
4346 * ChangeCipherSpec
4347 * Finished
4348 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004349 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004350 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004351 break;
4352
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004353 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004354 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004355 break;
4356
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004357 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004358 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004359 break;
4360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004361 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004362 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004363 break;
4364
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004365 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004366 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004367 break;
4368
4369 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004370 * ==> ( NewSessionTicket )
4371 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004372 * Finished
4373 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004374 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4375#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004376 if (ssl->handshake->new_session_ticket != 0) {
4377 ret = ssl_write_new_session_ticket(ssl);
4378 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004379#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004380 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004381 break;
4382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004383 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004384 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004385 break;
4386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004387 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004388 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004389 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004390 break;
4391
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004392 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004393 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004394 break;
4395
4396 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004397 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4398 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004399 }
4400
Gilles Peskine449bd832023-01-11 14:50:10 +01004401 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004402}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004403
Gilles Peskine449bd832023-01-11 14:50:10 +01004404void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004405{
TRodziewicz3946f792021-06-14 12:11:18 +02004406 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004407}
4408
Jerry Yufb4b6472022-01-27 15:03:26 +08004409#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */