blob: ed2fbd1d6f2f89724810439dff515d517da2a0d4 [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 Setti77a75682023-05-15 11:18:46 +0200679 mbedtls_ecp_group_id grp_id = mbedtls_pk_ec_ro(*pk)->grp.id;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100680 mbedtls_ecp_group_id curr_grp_id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100681
Gilles Peskine449bd832023-01-11 14:50:10 +0100682 while (*curr_tls_id != 0) {
683 curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
684 if (curr_grp_id == grp_id) {
685 return 0;
686 }
Valerio Setti18c9fed2022-12-30 17:44:24 +0100687 curr_tls_id++;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100688 }
689
Gilles Peskine449bd832023-01-11 14:50:10 +0100690 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100691}
Valerio Settie9646ec2023-08-02 20:02:28 +0200692#endif /* MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100693
694/*
695 * Try picking a certificate for this ciphersuite,
696 * return 0 on success and -1 on failure.
697 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200698MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100699static int ssl_pick_cert(mbedtls_ssl_context *ssl,
700 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100701{
Glenn Strauss041a3762022-03-15 06:08:29 -0400702 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200703#if defined(MBEDTLS_USE_PSA_CRYPTO)
704 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100705 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200706 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100707 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200708#else
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100709 mbedtls_pk_type_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100710 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200711#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200712 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100713
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200714#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100715 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100716 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100717 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100718#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100719 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100720
David Horstmann3a334c22022-10-25 10:53:44 +0100721 int pk_alg_is_none = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200722#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100723 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200724#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 pk_alg_is_none = (pk_alg == MBEDTLS_PK_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200726#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100727 if (pk_alg_is_none) {
728 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200729 }
730
Gilles Peskine449bd832023-01-11 14:50:10 +0100731 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
732
733 if (list == NULL) {
734 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
735 return -1;
736 }
737
738 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400739 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100740 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
741 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000742
David Horstmann3a334c22022-10-25 10:53:44 +0100743 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200744#if defined(MBEDTLS_USE_PSA_CRYPTO)
745#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100746 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
747 ssl->conf->f_async_decrypt_start != NULL ||
748 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
749 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200750#else
David Horstmann3a334c22022-10-25 10:53:44 +0100751 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100752 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200753#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
754#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100755 key_type_matches = mbedtls_pk_can_do(&cur->cert->pk, pk_alg);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200756#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100757 if (!key_type_matches) {
758 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100759 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000760 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100761
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200762 /*
763 * This avoids sending the client a cert it'll reject based on
764 * keyUsage or other extensions.
765 *
766 * It also allows the user to provision different certificates for
767 * different uses based on keyUsage, eg if they want to avoid signing
768 * and decrypting with the same RSA key.
769 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100770 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
771 MBEDTLS_SSL_IS_SERVER, &flags) != 0) {
772 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
773 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200774 continue;
775 }
776
Valerio Settie9646ec2023-08-02 20:02:28 +0200777#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100778 if (pk_alg == MBEDTLS_PK_ECDSA &&
779 ssl_check_key_curve(&cur->cert->pk,
780 ssl->handshake->curves_tls_id) != 0) {
781 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100782 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000783 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100784#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100785
786 /* If we get there, we got a winner */
787 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100788 }
789
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200790 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100791 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100792 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100793 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
794 ssl->handshake->key_cert->cert);
795 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100796 }
797
Gilles Peskine449bd832023-01-11 14:50:10 +0100798 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100799}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200800#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100801
802/*
803 * Check if a given ciphersuite is suitable for use with our config/keys/etc
804 * Sets ciphersuite_info only if the suite matches.
805 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200806MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100807static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
808 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100809{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200810 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100811
Jerry Yue7541932022-01-28 10:21:24 +0800812#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100813 mbedtls_pk_type_t sig_type;
814#endif
815
Gilles Peskine449bd832023-01-11 14:50:10 +0100816 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
817 if (suite_info == NULL) {
818 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
819 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100820 }
821
Gilles Peskine449bd832023-01-11 14:50:10 +0100822 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
823 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000824
Gilles Peskine449bd832023-01-11 14:50:10 +0100825 if (suite_info->min_tls_version > ssl->tls_version ||
826 suite_info->max_tls_version < ssl->tls_version) {
827 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
828 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000829 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100830
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200831#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100832 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
833 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
834 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
835 "not configured or ext missing"));
836 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200837 }
838#endif
839
840
Valerio Setti60d3b912023-07-25 10:43:53 +0200841#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +0200842 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100843 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
844 (ssl->handshake->curves_tls_id == NULL ||
845 ssl->handshake->curves_tls_id[0] == 0)) {
846 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
847 "no common elliptic curve"));
848 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000849 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100850#endif
851
Gilles Peskineeccd8882020-03-10 12:19:08 +0100852#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100853 /* If the ciphersuite requires a pre-shared key and we don't
854 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100855 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
856 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
857 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
858 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000859 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100860#endif
861
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200862#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100863 /*
864 * Final check: if ciphersuite requires us to have a
865 * certificate/key of a particular type:
866 * - select the appropriate certificate if we have one, or
867 * - try the next ciphersuite if we don't
868 * This must be done last since we modify the key_cert list.
869 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100870 if (ssl_pick_cert(ssl, suite_info) != 0) {
871 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
872 "no suitable certificate"));
873 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000874 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100875#endif
876
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200877#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
878 /* If the ciphersuite requires signing, check whether
879 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100880 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
881 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200882 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100883 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
884 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
885 "for signature algorithm %u", (unsigned) sig_type));
886 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200887 }
888
889#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
890
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100891 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100892 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100893}
894
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200895/* This function doesn't alert on errors that happen early during
896 ClientHello parsing because they might indicate that the client is
897 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200898MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100899static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000900{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100901 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200902 size_t i, j;
903 size_t ciph_offset, comp_offset, ext_offset;
904 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200905#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200906 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100907#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000908 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200909#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000910 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100911#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000912 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200913 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200914 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000915
Hanno Becker7e5437a2017-04-28 17:15:26 +0100916 /* If there is no signature-algorithm extension present,
917 * we need to fall back to the default values for allowed
918 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800919#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100920 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800921#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100922
Gilles Peskine449bd832023-01-11 14:50:10 +0100923 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000924
David Horstmanne0af39a2022-10-06 18:19:18 +0100925 int renegotiating;
926
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200927#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200928read_record_header:
929#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100930 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200931 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100932 * otherwise read it ourselves manually in order to support SSLv2
933 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100934 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
935 * ClientHello has been already fully fetched by the TLS 1.3 code and the
936 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100937 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100938 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200939#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100940 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100941#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100942 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100943 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200944 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100945 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
946 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000947 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000948 }
949
950 buf = ssl->in_hdr;
951
Gilles Peskine449bd832023-01-11 14:50:10 +0100952 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000953
Paul Bakkerec636f32012-09-09 19:17:02 +0000954 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100955 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000956 *
957 * Record layer:
958 * 0 . 0 message type
959 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200960 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000961 * 3 . 4 message length
962 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100963 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
964 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100965
Gilles Peskine449bd832023-01-11 14:50:10 +0100966 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
967 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
968 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100969 }
970
Gilles Peskine449bd832023-01-11 14:50:10 +0100971 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
972 (ssl->in_len[0] << 8) | ssl->in_len[1]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100973
Gilles Peskine449bd832023-01-11 14:50:10 +0100974 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
975 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100976
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200977 /* For DTLS if this is the initial handshake, remember the client sequence
978 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200979#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100980 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200981#if defined(MBEDTLS_SSL_RENEGOTIATION)
982 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000983#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100984 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200985 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100986 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
987 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
988 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200989 }
990
Gilles Peskine449bd832023-01-11 14:50:10 +0100991 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
992 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200993
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200994#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100995 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
996 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200997 ssl->next_record_offset = 0;
998 ssl->in_left = 0;
999 goto read_record_header;
1000 }
1001
1002 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +01001003 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001004#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001005 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001006#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001007
Gilles Peskine449bd832023-01-11 14:50:10 +01001008 msg_len = (ssl->in_len[0] << 8) | ssl->in_len[1];
Paul Bakker5121ce52009-01-03 21:22:43 +00001009
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001010#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001011 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001012 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001013 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +01001014 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001015#endif
Paul Bakkerec636f32012-09-09 19:17:02 +00001016 {
Ronald Cron6291b232023-03-08 15:51:25 +01001017 if (ssl->keep_current_message) {
1018 ssl->keep_current_message = 0;
1019 } else {
1020 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
1021 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1022 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1023 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001024
Ronald Cron6291b232023-03-08 15:51:25 +01001025 if ((ret = mbedtls_ssl_fetch_input(ssl,
1026 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
1027 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
1028 return ret;
1029 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001030
Ronald Cron6291b232023-03-08 15:51:25 +01001031 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001032#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +01001033 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1034 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
1035 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001036#endif
Ronald Cron6291b232023-03-08 15:51:25 +01001037 ssl->in_left = 0;
1038 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001039 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001040
1041 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +00001042
Gilles Peskine449bd832023-01-11 14:50:10 +01001043 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001044
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001045 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
1046 if (0 != ret) {
1047 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1048 return ret;
1049 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001050
1051 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001052 * Handshake layer:
1053 * 0 . 0 handshake type
1054 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001055 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001056 * 6 . 8 DTLS only: fragment offset
1057 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001058 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001059 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1060 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1061 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001062 }
1063
Gilles Peskine449bd832023-01-11 14:50:10 +01001064 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001065
Gilles Peskine449bd832023-01-11 14:50:10 +01001066 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1067 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1068 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001069 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001070 {
Gilles Peskine449bd832023-01-11 14:50:10 +01001071 size_t handshake_len = MBEDTLS_GET_UINT24_BE(buf, 1);
1072 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %u",
1073 (unsigned) handshake_len));
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001074
1075 /* The record layer has a record size limit of 2^14 - 1 and
1076 * fragmentation is not supported, so buf[1] should be zero. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001077 if (buf[1] != 0) {
1078 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != 0",
1079 (unsigned) buf[1]));
1080 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001081 }
1082
1083 /* We don't support fragmentation of ClientHello (yet?) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001084 if (msg_len != mbedtls_ssl_hs_hdr_len(ssl) + handshake_len) {
1085 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != %u + %u",
1086 (unsigned) msg_len,
1087 (unsigned) mbedtls_ssl_hs_hdr_len(ssl),
1088 (unsigned) handshake_len));
1089 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001090 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001091 }
1092
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001093#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001094 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001095 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001096 * Copy the client's handshake message_seq on initial handshakes,
1097 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001098 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001099#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001100 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001101 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001102 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001103 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1104 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1105 "%u (expected %u)", cli_msg_seq,
1106 ssl->handshake->in_msg_seq));
1107 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001108 }
1109
1110 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001111 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001112#endif
1113 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001114 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001115 ssl->handshake->out_msg_seq = cli_msg_seq;
1116 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1117 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001118 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001119 /*
1120 * For now we don't support fragmentation, so make sure
1121 * fragment_offset == 0 and fragment_length == length
1122 */
1123 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001124 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1125 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1126 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001127 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001128 4, ("fragment_offset=%u fragment_length=%u length=%u",
1129 (unsigned) fragment_offset, (unsigned) fragment_length,
1130 (unsigned) length));
1131 if (fragment_offset != 0 || length != fragment_length) {
1132 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1133 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001134 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001135 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001136 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001137#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001138
Gilles Peskine449bd832023-01-11 14:50:10 +01001139 buf += mbedtls_ssl_hs_hdr_len(ssl);
1140 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001141
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001142 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001143 * ClientHello layer:
1144 * 0 . 1 protocol version
1145 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
1146 * 34 . 35 session id length (1 byte)
1147 * 35 . 34+x session id
1148 * 35+x . 35+x DTLS only: cookie length (1 byte)
1149 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001150 * .. . .. ciphersuite list length (2 bytes)
1151 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001152 * .. . .. compression alg. list length (1 byte)
1153 * .. . .. compression alg. list
1154 * .. . .. extensions length (2 bytes, optional)
1155 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001156 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001157
1158 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001159 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001160 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1161 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001162 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001163 if (msg_len < 38) {
1164 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1165 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001166 }
1167
1168 /*
1169 * Check and save the protocol version
1170 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001171 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001172
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01001173 ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1174 ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001175 ssl->session_negotiate->tls_version = ssl->tls_version;
Paul Bakkerec636f32012-09-09 19:17:02 +00001176
Gilles Peskine449bd832023-01-11 14:50:10 +01001177 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1178 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1179 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1180 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1181 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001182 }
1183
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001184 /*
1185 * Save client random (inc. Unix time)
1186 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001187 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001188
Gilles Peskine449bd832023-01-11 14:50:10 +01001189 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001190
1191 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001192 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001193 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001194 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001195
Gilles Peskine449bd832023-01-11 14:50:10 +01001196 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1197 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1198 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1199 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1200 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1201 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001202 }
1203
Gilles Peskine449bd832023-01-11 14:50:10 +01001204 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001205
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001206 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001207 memset(ssl->session_negotiate->id, 0,
1208 sizeof(ssl->session_negotiate->id));
1209 memcpy(ssl->session_negotiate->id, buf + 35,
1210 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001211
1212 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001213 * Check the cookie length and content
1214 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001215#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001216 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001217 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001218 cookie_len = buf[cookie_offset];
1219
Gilles Peskine449bd832023-01-11 14:50:10 +01001220 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1221 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1222 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1223 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1224 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001225 }
1226
Gilles Peskine449bd832023-01-11 14:50:10 +01001227 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1228 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001229
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001230#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001231 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001232#if defined(MBEDTLS_SSL_RENEGOTIATION)
1233 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001234#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001235 ) {
1236 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1237 buf + cookie_offset + 1, cookie_len,
1238 ssl->cli_id, ssl->cli_id_len) != 0) {
1239 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001240 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001241 } else {
1242 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001243 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001244 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001245 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001246#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001247 {
1248 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001249 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001250 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001251 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1252 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001253 }
1254
Gilles Peskine449bd832023-01-11 14:50:10 +01001255 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001256 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001257
Gilles Peskine449bd832023-01-11 14:50:10 +01001258 /*
1259 * Check the ciphersuitelist length (will be parsed later)
1260 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001261 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001262 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001263#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001264 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001265
Gilles Peskine449bd832023-01-11 14:50:10 +01001266 ciph_len = (buf[ciph_offset + 0] << 8)
1267 | (buf[ciph_offset + 1]);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001268
Gilles Peskine449bd832023-01-11 14:50:10 +01001269 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001270 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001271 (ciph_len % 2) != 0) {
1272 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1273 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1274 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1275 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001276 }
1277
Gilles Peskine449bd832023-01-11 14:50:10 +01001278 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1279 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001280
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001281 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001282 * Check the compression algorithm's length.
1283 * The list contents are ignored because implementing
1284 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1285 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001286 */
1287 comp_offset = ciph_offset + 2 + ciph_len;
1288
1289 comp_len = buf[comp_offset];
1290
Gilles Peskine449bd832023-01-11 14:50:10 +01001291 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001292 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001293 comp_len + comp_offset + 1 > msg_len) {
1294 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1295 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1296 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1297 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001298 }
1299
Gilles Peskine449bd832023-01-11 14:50:10 +01001300 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1301 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001302
Gilles Peskine449bd832023-01-11 14:50:10 +01001303 /*
1304 * Check the extension length
1305 */
1306 ext_offset = comp_offset + 1 + comp_len;
1307 if (msg_len > ext_offset) {
1308 if (msg_len < ext_offset + 2) {
1309 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1310 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1311 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1312 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001313 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001314
Gilles Peskine449bd832023-01-11 14:50:10 +01001315 ext_len = (buf[ext_offset + 0] << 8)
1316 | (buf[ext_offset + 1]);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001317
Gilles Peskine449bd832023-01-11 14:50:10 +01001318 if (msg_len != ext_offset + 2 + ext_len) {
1319 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1320 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1321 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1322 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1323 }
1324 } else {
1325 ext_len = 0;
1326 }
Paul Bakker48916f92012-09-16 19:57:18 +00001327
Gilles Peskine449bd832023-01-11 14:50:10 +01001328 ext = buf + ext_offset + 2;
1329 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1330
1331 while (ext_len != 0) {
1332 unsigned int ext_id;
1333 unsigned int ext_size;
1334 if (ext_len < 4) {
1335 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1336 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1337 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1338 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1339 }
1340 ext_id = ((ext[0] << 8) | (ext[1]));
1341 ext_size = ((ext[2] << 8) | (ext[3]));
1342
1343 if (ext_size + 4 > ext_len) {
1344 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1345 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1346 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1347 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1348 }
1349 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001350#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001351 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001352 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1353 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1354 ext + 4 + ext_size);
1355 if (ret != 0) {
1356 return ret;
1357 }
Simon Butcher584a5472016-05-23 16:24:52 +01001358 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001359#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001360
Simon Butcher584a5472016-05-23 16:24:52 +01001361 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001362 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001363#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001364 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001365#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001366
Gilles Peskine449bd832023-01-11 14:50:10 +01001367 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1368 if (ret != 0) {
1369 return ret;
1370 }
Simon Butcher584a5472016-05-23 16:24:52 +01001371 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001372
Jerry Yue7541932022-01-28 10:21:24 +08001373#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001374 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001375 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001376
Gilles Peskine449bd832023-01-11 14:50:10 +01001377 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1378 if (ret != 0) {
1379 return ret;
1380 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001381
1382 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001383 break;
Jerry Yue7541932022-01-28 10:21:24 +08001384#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001385
Valerio Setti60d3b912023-07-25 10:43:53 +02001386#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001387 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001388 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001389 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001390 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001391
Gilles Peskine449bd832023-01-11 14:50:10 +01001392 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1393 if (ret != 0) {
1394 return ret;
1395 }
Simon Butcher584a5472016-05-23 16:24:52 +01001396 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001397
Simon Butcher584a5472016-05-23 16:24:52 +01001398 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001399 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001400 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001401
Gilles Peskine449bd832023-01-11 14:50:10 +01001402 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1403 if (ret != 0) {
1404 return ret;
1405 }
Simon Butcher584a5472016-05-23 16:24:52 +01001406 break;
Valerio Setti60d3b912023-07-25 10:43:53 +02001407#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001408 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti45d56f32023-07-13 17:23:20 +02001409 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001410
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001411#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001412 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001413 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001414
Gilles Peskine449bd832023-01-11 14:50:10 +01001415 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1416 if (ret != 0) {
1417 return ret;
1418 }
Simon Butcher584a5472016-05-23 16:24:52 +01001419 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001420#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1421
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001422#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001423 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001424 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001425
Gilles Peskine449bd832023-01-11 14:50:10 +01001426 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1427 if (ret != 0) {
1428 return ret;
1429 }
Simon Butcher584a5472016-05-23 16:24:52 +01001430 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001431#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001432
Hanno Beckera0e20d02019-05-15 14:03:01 +01001433#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001434 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001435 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001436
Gilles Peskine449bd832023-01-11 14:50:10 +01001437 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1438 if (ret != 0) {
1439 return ret;
1440 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001441 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001442#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001443
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001444#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001445 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001446 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001447
Gilles Peskine449bd832023-01-11 14:50:10 +01001448 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1449 if (ret != 0) {
1450 return ret;
1451 }
Simon Butcher584a5472016-05-23 16:24:52 +01001452 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001453#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001454
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001455#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001456 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001457 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001458
Gilles Peskine449bd832023-01-11 14:50:10 +01001459 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1460 if (ret != 0) {
1461 return ret;
1462 }
Simon Butcher584a5472016-05-23 16:24:52 +01001463 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001464#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001465
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001466#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001467 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001468 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001469
Gilles Peskine449bd832023-01-11 14:50:10 +01001470 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1471 if (ret != 0) {
1472 return ret;
1473 }
Simon Butcher584a5472016-05-23 16:24:52 +01001474 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001475#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001476
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001477#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001478 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001479 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001480
Gilles Peskine449bd832023-01-11 14:50:10 +01001481 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1482 ext + 4 + ext_size);
1483 if (ret != 0) {
1484 return ret;
1485 }
Simon Butcher584a5472016-05-23 16:24:52 +01001486 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001487#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001488
Johan Pascalb62bb512015-12-03 21:56:45 +01001489#if defined(MBEDTLS_SSL_DTLS_SRTP)
1490 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001491 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001492
Gilles Peskine449bd832023-01-11 14:50:10 +01001493 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1494 if (ret != 0) {
1495 return ret;
1496 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001497 break;
1498#endif /* MBEDTLS_SSL_DTLS_SRTP */
1499
Simon Butcher584a5472016-05-23 16:24:52 +01001500 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001501 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1502 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001503 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001504
Gilles Peskine449bd832023-01-11 14:50:10 +01001505 ext_len -= 4 + ext_size;
1506 ext += 4 + ext_size;
1507 }
1508
Jerry Yue7541932022-01-28 10:21:24 +08001509#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001510
1511 /*
1512 * Try to fall back to default hash SHA1 if the client
1513 * hasn't provided any preferred signature-hash combinations.
1514 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001515 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001516 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1517 const uint16_t default_sig_algs[] = {
Valerio Settie9646ec2023-08-02 20:02:28 +02001518#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001519 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1520 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001521#endif
1522#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001523 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1524 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001525#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001526 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001527 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001528
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001529 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1530 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1531 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001532
Gilles Peskine449bd832023-01-11 14:50:10 +01001533 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001534 }
1535
Jerry Yue7541932022-01-28 10:21:24 +08001536#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001537
Paul Bakker48916f92012-09-16 19:57:18 +00001538 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001539 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1540 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001541 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1542 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1543 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001544#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001545 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1546 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1547 "during renegotiation"));
1548 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1549 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1550 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001551 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001552#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001553 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001554 break;
1555 }
1556 }
1557
1558 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001559 * Renegotiation security checks
1560 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001561 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1562 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1563 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001564 handshake_failure = 1;
1565 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001566#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001567 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001568 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001569 renegotiation_info_seen == 0) {
1570 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001571 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001572 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1573 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1574 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1575 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001576 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001577 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1578 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1579 renegotiation_info_seen == 1) {
1580 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001581 handshake_failure = 1;
1582 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001583#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001584
Gilles Peskine449bd832023-01-11 14:50:10 +01001585 if (handshake_failure == 1) {
1586 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1587 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1588 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001589 }
Paul Bakker380da532012-04-18 16:10:25 +00001590
Paul Bakker41c83d32013-03-20 14:39:14 +01001591 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001592 * Server certification selection (after processing TLS extensions)
1593 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001594 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1595 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1596 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001597 }
Glenn Strauss69894072022-01-24 12:58:00 -05001598#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1599 ssl->handshake->sni_name = NULL;
1600 ssl->handshake->sni_name_len = 0;
1601#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001602
1603 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001604 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001605 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001606 * and certificate from the SNI callback triggered by the SNI extension
1607 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001608 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001609 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001610 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001611 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001612
Gilles Peskine449bd832023-01-11 14:50:10 +01001613 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1614 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1615 for (i = 0; ciphersuites[i] != 0; i++) {
1616 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001617 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001618 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001619
TRodziewicz8476f2f2021-06-02 14:34:47 +02001620 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001621
Gilles Peskine449bd832023-01-11 14:50:10 +01001622 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1623 &ciphersuite_info)) != 0) {
1624 return ret;
1625 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001626
Gilles Peskine449bd832023-01-11 14:50:10 +01001627 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001628 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001629 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001630 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001631 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001632 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001633 for (i = 0; ciphersuites[i] != 0; i++) {
1634 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1635 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001636 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001637 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001638
1639 got_common_suite = 1;
1640
Gilles Peskine449bd832023-01-11 14:50:10 +01001641 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1642 &ciphersuite_info)) != 0) {
1643 return ret;
1644 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001645
Gilles Peskine449bd832023-01-11 14:50:10 +01001646 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001647 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001648 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001649 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001650 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001651 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001652
Gilles Peskine449bd832023-01-11 14:50:10 +01001653 if (got_common_suite) {
1654 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1655 "but none of them usable"));
1656 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1657 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1658 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1659 } else {
1660 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1661 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1662 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1663 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001664 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001665
1666have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001667 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001668
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001669 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001670 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001671
Paul Bakker5121ce52009-01-03 21:22:43 +00001672 ssl->state++;
1673
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001674#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001675 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1676 mbedtls_ssl_recv_flight_completed(ssl);
1677 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001678#endif
1679
Hanno Becker7e5437a2017-04-28 17:15:26 +01001680 /* Debugging-only output for testsuite */
1681#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001682 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001683 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1684 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001685 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001686 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1687 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1688 sig_hash));
1689 } else {
1690 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1691 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001692 }
1693#endif
1694
Gilles Peskine449bd832023-01-11 14:50:10 +01001695 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001696
Gilles Peskine449bd832023-01-11 14:50:10 +01001697 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001698}
1699
Hanno Beckera0e20d02019-05-15 14:03:01 +01001700#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001701static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1702 unsigned char *buf,
1703 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001704{
1705 unsigned char *p = buf;
1706 size_t ext_len;
1707 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1708
1709 *olen = 0;
1710
1711 /* Skip writing the extension if we don't want to use it or if
1712 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001713 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001714 return;
1715 }
1716
Gilles Peskine449bd832023-01-11 14:50:10 +01001717 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1718 * which is at most 255, so the increment cannot overflow. */
1719 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1720 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1721 return;
1722 }
1723
1724 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001725
1726 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001727 * struct {
1728 * opaque cid<0..2^8-1>;
1729 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001730 */
1731 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001732 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001733 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001734 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001735 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001736
1737 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001738 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001739
1740 *olen = ssl->own_cid_len + 5;
1741}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001742#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001743
Neil Armstrong76b74072022-04-06 13:43:54 +02001744#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001745static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1746 unsigned char *buf,
1747 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001748{
1749 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001750 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001751
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001752 /*
1753 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1754 * from a client and then selects a stream or Authenticated Encryption
1755 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1756 * encrypt-then-MAC response extension back to the client."
1757 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001758 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001759 ssl->session_negotiate->ciphersuite);
1760 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001761 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001762 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001763 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001764 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001765 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001766 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001767
Gilles Peskine449bd832023-01-11 14:50:10 +01001768 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001769 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001770 }
Ronald Cron862902d2022-03-24 14:15:28 +01001771 }
1772
Gilles Peskine449bd832023-01-11 14:50:10 +01001773 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001774 *olen = 0;
1775 return;
1776 }
1777
Gilles Peskine449bd832023-01-11 14:50:10 +01001778 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001779
Gilles Peskine449bd832023-01-11 14:50:10 +01001780 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001781 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001782
1783 *p++ = 0x00;
1784 *p++ = 0x00;
1785
1786 *olen = 4;
1787}
Neil Armstrong76b74072022-04-06 13:43:54 +02001788#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001789
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001790#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001791static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1792 unsigned char *buf,
1793 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001794{
1795 unsigned char *p = buf;
1796
Gilles Peskine449bd832023-01-11 14:50:10 +01001797 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001798 *olen = 0;
1799 return;
1800 }
1801
Gilles Peskine449bd832023-01-11 14:50:10 +01001802 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1803 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001804
Gilles Peskine449bd832023-01-11 14:50:10 +01001805 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001806 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001807
1808 *p++ = 0x00;
1809 *p++ = 0x00;
1810
1811 *olen = 4;
1812}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001813#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001814
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001815#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001816static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1817 unsigned char *buf,
1818 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001819{
1820 unsigned char *p = buf;
1821
Gilles Peskine449bd832023-01-11 14:50:10 +01001822 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001823 *olen = 0;
1824 return;
1825 }
1826
Gilles Peskine449bd832023-01-11 14:50:10 +01001827 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001828
Gilles Peskine449bd832023-01-11 14:50:10 +01001829 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001830 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001831
1832 *p++ = 0x00;
1833 *p++ = 0x00;
1834
1835 *olen = 4;
1836}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001837#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001838
Gilles Peskine449bd832023-01-11 14:50:10 +01001839static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1840 unsigned char *buf,
1841 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001842{
1843 unsigned char *p = buf;
1844
Gilles Peskine449bd832023-01-11 14:50:10 +01001845 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001846 *olen = 0;
1847 return;
1848 }
1849
Gilles Peskine449bd832023-01-11 14:50:10 +01001850 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001851
Gilles Peskine449bd832023-01-11 14:50:10 +01001852 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001853 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001854
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001855#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001856 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001857 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001858 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001859 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001860
Gilles Peskine449bd832023-01-11 14:50:10 +01001861 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001862 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001863 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001864 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001865 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001866#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001867 {
1868 *p++ = 0x00;
1869 *p++ = 0x01;
1870 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001871 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001872
1873 *olen = p - buf;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001874}
1875
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001876#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001877static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1878 unsigned char *buf,
1879 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001880{
1881 unsigned char *p = buf;
1882
Gilles Peskine449bd832023-01-11 14:50:10 +01001883 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001884 *olen = 0;
1885 return;
1886 }
1887
Gilles Peskine449bd832023-01-11 14:50:10 +01001888 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001889
Gilles Peskine449bd832023-01-11 14:50:10 +01001890 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001891 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001892
1893 *p++ = 0x00;
1894 *p++ = 1;
1895
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001896 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001897
1898 *olen = 5;
1899}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001900#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001901
Valerio Setti7aeec542023-07-05 18:57:21 +02001902#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02001903 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02001904 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001905static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1906 unsigned char *buf,
1907 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001908{
1909 unsigned char *p = buf;
1910 ((void) ssl);
1911
Gilles Peskine449bd832023-01-11 14:50:10 +01001912 if ((ssl->handshake->cli_exts &
1913 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001914 *olen = 0;
1915 return;
1916 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001917
Gilles Peskine449bd832023-01-11 14:50:10 +01001918 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001919
Gilles Peskine449bd832023-01-11 14:50:10 +01001920 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001921 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001922
1923 *p++ = 0x00;
1924 *p++ = 2;
1925
1926 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001927 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001928
1929 *olen = 6;
1930}
Valerio Setti45d56f32023-07-13 17:23:20 +02001931#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
Valerio Settie9646ec2023-08-02 20:02:28 +02001932 MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
Valerio Setti7aeec542023-07-05 18:57:21 +02001933 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001934
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001935#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001936static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1937 unsigned char *buf,
1938 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001939{
Janos Follath865b3eb2019-12-16 11:46:15 +00001940 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001941 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001942 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001943 size_t kkpp_len;
1944
1945 *olen = 0;
1946
1947 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001948 if (ssl->handshake->ciphersuite_info->key_exchange !=
1949 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001950 return;
1951 }
1952
Gilles Peskine449bd832023-01-11 14:50:10 +01001953 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1954
1955 if (end - p < 4) {
1956 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1957 return;
1958 }
1959
1960 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001961 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001962
Neil Armstrongca7d5062022-05-31 14:43:23 +02001963#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001964 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
1965 p + 2, end - p - 2, &kkpp_len,
1966 MBEDTLS_ECJPAKE_ROUND_ONE);
1967 if (ret != 0) {
1968 psa_destroy_key(ssl->handshake->psa_pake_password);
1969 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1970 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001971 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001972 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001973#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001974 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
1975 p + 2, end - p - 2, &kkpp_len,
1976 ssl->conf->f_rng, ssl->conf->p_rng);
1977 if (ret != 0) {
1978 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001979 return;
1980 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001981#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001982
Gilles Peskine449bd832023-01-11 14:50:10 +01001983 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001984 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001985
1986 *olen = kkpp_len + 4;
1987}
1988#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1989
Gilles Peskine449bd832023-01-11 14:50:10 +01001990#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1991static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1992 unsigned char *buf,
1993 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001994{
Ron Eldor75870ec2018-12-06 17:31:55 +02001995 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001996 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001997 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1998
1999 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02002000
Gilles Peskine449bd832023-01-11 14:50:10 +01002001 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
2002 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01002003 return;
2004 }
2005
Gilles Peskine449bd832023-01-11 14:50:10 +01002006 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01002007
Gilles Peskine449bd832023-01-11 14:50:10 +01002008 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02002009 mki_len = ssl->dtls_srtp_info.mki_len;
2010 }
2011
Johan Pascal9bc97ca2020-09-21 23:44:45 +02002012 /* The extension total size is 9 bytes :
2013 * - 2 bytes for the extension tag
2014 * - 2 bytes for the total size
2015 * - 2 bytes for the protection profile length
2016 * - 2 bytes for the protection profile
2017 * - 1 byte for the mki length
2018 * + the actual mki length
2019 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01002020 if ((size_t) (end - buf) < mki_len + 9) {
2021 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02002022 return;
2023 }
2024
Johan Pascalb62bb512015-12-03 21:56:45 +01002025 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01002026 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03002027 /*
2028 * total length 5 and mki value: only one profile(2 bytes)
2029 * and length(2 bytes) and srtp_mki )
2030 */
Ron Eldor591f1622018-01-22 12:30:04 +02002031 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002032 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01002033
2034 /* protection profile length: 2 */
2035 buf[4] = 0x00;
2036 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02002037 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01002038 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2039 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2040 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
2041 } else {
2042 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02002043 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01002044 }
2045
Ron Eldor591f1622018-01-22 12:30:04 +02002046 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01002047 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01002048
Ron Eldor591f1622018-01-22 12:30:04 +02002049 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01002050}
2051#endif /* MBEDTLS_SSL_DTLS_SRTP */
2052
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002053#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002054MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002055static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002056{
Janos Follath865b3eb2019-12-16 11:46:15 +00002057 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002058 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002059 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002060
Gilles Peskine449bd832023-01-11 14:50:10 +01002061 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002062
2063 /*
2064 * struct {
2065 * ProtocolVersion server_version;
2066 * opaque cookie<0..2^8-1>;
2067 * } HelloVerifyRequest;
2068 */
2069
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002070 /* The RFC is not clear on this point, but sending the actual negotiated
2071 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002072 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2073 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002074 p += 2;
2075
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002076 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002077 if (ssl->conf->f_cookie_write == NULL) {
2078 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2079 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002080 }
2081
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002082 /* Skip length byte until we know the length */
2083 cookie_len_byte = p++;
2084
Gilles Peskine449bd832023-01-11 14:50:10 +01002085 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2086 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2087 ssl->cli_id, ssl->cli_id_len)) != 0) {
2088 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2089 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002090 }
2091
Gilles Peskine449bd832023-01-11 14:50:10 +01002092 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002093
Gilles Peskine449bd832023-01-11 14:50:10 +01002094 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002095
2096 ssl->out_msglen = p - ssl->out_msg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002097 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2098 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002099
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002100 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002101
Gilles Peskine449bd832023-01-11 14:50:10 +01002102 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2103 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2104 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002105 }
2106
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002107#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002108 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2109 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2110 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2111 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002112 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002113#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002114
Gilles Peskine449bd832023-01-11 14:50:10 +01002115 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002116
Gilles Peskine449bd832023-01-11 14:50:10 +01002117 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002118}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002119#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002120
Gilles Peskine449bd832023-01-11 14:50:10 +01002121static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002122{
2123 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002124 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002125 mbedtls_ssl_session * const session = ssl->session_negotiate;
2126
2127 /* Resume is 0 by default, see ssl_handshake_init().
2128 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002129 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002130 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002131 }
2132 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002133 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002134 }
2135 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002136 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002137 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002138#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002139 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
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#endif
2143
Gilles Peskine449bd832023-01-11 14:50:10 +01002144 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002145
Gilles Peskine449bd832023-01-11 14:50:10 +01002146 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2147 session->id,
2148 session->id_len,
2149 &session_tmp);
2150 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002151 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002152 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002153
Gilles Peskine449bd832023-01-11 14:50:10 +01002154 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002155 /* Mismatch between cached and negotiated session */
2156 goto exit;
2157 }
2158
2159 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002160 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002161 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002162 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002163
Gilles Peskine449bd832023-01-11 14:50:10 +01002164 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002165 ssl->handshake->resume = 1;
2166
2167exit:
2168
Gilles Peskine449bd832023-01-11 14:50:10 +01002169 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002170}
2171
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002172MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002173static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002174{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002175#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002176 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002177#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002178 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002179 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002180 unsigned char *buf, *p;
2181
Gilles Peskine449bd832023-01-11 14:50:10 +01002182 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002183
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002184#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002185 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2186 ssl->handshake->cookie_verify_result != 0) {
2187 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2188 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002189
Gilles Peskine449bd832023-01-11 14:50:10 +01002190 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002191 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002192#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002193
Gilles Peskine449bd832023-01-11 14:50:10 +01002194 if (ssl->conf->f_rng == NULL) {
2195 MBEDTLS_SSL_DEBUG_MSG(1, ("no RNG provided"));
2196 return MBEDTLS_ERR_SSL_NO_RNG;
Paul Bakkera9a028e2013-11-21 17:31:06 +01002197 }
2198
Paul Bakker5121ce52009-01-03 21:22:43 +00002199 /*
2200 * 0 . 0 handshake type
2201 * 1 . 3 handshake length
2202 * 4 . 5 protocol version
2203 * 6 . 9 UNIX time()
2204 * 10 . 37 random bytes
2205 */
2206 buf = ssl->out_msg;
2207 p = buf + 4;
2208
Gilles Peskine449bd832023-01-11 14:50:10 +01002209 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002210 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002211
Gilles Peskine449bd832023-01-11 14:50:10 +01002212 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2213 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002214
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002215#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002216 t = mbedtls_time(NULL);
2217 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002218 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002219
Gilles Peskine449bd832023-01-11 14:50:10 +01002220 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2221 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002222#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002223 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2224 return ret;
2225 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002226
2227 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002228#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002229
Ronald Cronc5649382023-04-04 15:33:42 +02002230 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002231 return ret;
2232 }
Ronald Cronc5649382023-04-04 15:33:42 +02002233 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002234
Ronald Cronc5649382023-04-04 15:33:42 +02002235#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2236 /*
2237 * RFC 8446
2238 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2239 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2240 * response to a ClientHello MUST set the last 8 bytes of their Random
2241 * value specially in their ServerHello.
2242 */
2243 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2244 static const unsigned char magic_tls12_downgrade_string[] =
2245 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2246
2247 MBEDTLS_STATIC_ASSERT(
2248 sizeof(magic_tls12_downgrade_string) == 8,
2249 "magic_tls12_downgrade_string does not have the expected size");
2250
Ronald Cronfe01ec22023-04-06 09:56:53 +02002251 memcpy(p, magic_tls12_downgrade_string,
2252 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002253 } else
2254#endif
2255 {
2256 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2257 return ret;
2258 }
2259 }
2260 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002261
Gilles Peskine449bd832023-01-11 14:50:10 +01002262 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002263
Gilles Peskine449bd832023-01-11 14:50:10 +01002264 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002265
Gilles Peskine449bd832023-01-11 14:50:10 +01002266 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002267
Gilles Peskine449bd832023-01-11 14:50:10 +01002268 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002269 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002270 * New session, create a new session id,
2271 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002272 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002273 ssl->state++;
2274
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002275#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002276 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002277#endif
2278
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002279#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002280 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002281 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002282 memset(ssl->session_negotiate->id, 0, 32);
2283 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002284#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002285 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002286 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002287 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2288 n)) != 0) {
2289 return ret;
2290 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002291 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002292 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002293 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002294 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002295 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002296 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002297 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002298
Gilles Peskine449bd832023-01-11 14:50:10 +01002299 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2300 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2301 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002302 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002303 }
2304
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002305 /*
2306 * 38 . 38 session id length
2307 * 39 . 38+n session id
2308 * 39+n . 40+n chosen ciphersuite
2309 * 41+n . 41+n chosen compression alg.
2310 * 42+n . 43+n extensions length
2311 * 44+n . 43+n+m extensions
2312 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002313 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002314 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002315 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002316
Gilles Peskine449bd832023-01-11 14:50:10 +01002317 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2318 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2319 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2320 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002321
Gilles Peskine449bd832023-01-11 14:50:10 +01002322 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002323 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002324 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002325
Gilles Peskine449bd832023-01-11 14:50:10 +01002326 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2327 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2328 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2329 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002330
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002331 /*
2332 * First write extensions, then the total length
2333 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002334 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002335 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002336
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002337#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002338 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002339 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002340#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002341
Hanno Beckera0e20d02019-05-15 14:03:01 +01002342#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002343 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002344 ext_len += olen;
2345#endif
2346
Neil Armstrong76b74072022-04-06 13:43:54 +02002347#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002348 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002349 ext_len += olen;
2350#endif
2351
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002352#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002353 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002354 ext_len += olen;
2355#endif
2356
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002357#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002358 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002359 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002360#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002361
Valerio Setti7aeec542023-07-05 18:57:21 +02002362#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
Valerio Settie9646ec2023-08-02 20:02:28 +02002363 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
Valerio Setti45d56f32023-07-13 17:23:20 +02002364 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002365 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002366 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2367 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2368 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002369 ext_len += olen;
2370 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002371#endif
2372
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002373#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002374 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002375 ext_len += olen;
2376#endif
2377
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002378#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002379 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002380 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2381 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002382 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002383 }
Paul Elliottf518f812022-07-11 12:36:20 +01002384
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002385 ext_len += olen;
2386#endif
2387
Johan Pascalb62bb512015-12-03 21:56:45 +01002388#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002389 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002390 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002391#endif
2392
Gilles Peskine449bd832023-01-11 14:50:10 +01002393 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2394 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002395
Gilles Peskine449bd832023-01-11 14:50:10 +01002396 if (ext_len > 0) {
2397 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002398 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002399 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002400
2401 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002402 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2403 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002404
Gilles Peskine449bd832023-01-11 14:50:10 +01002405 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002406
Gilles Peskine449bd832023-01-11 14:50:10 +01002407 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002408
Gilles Peskine449bd832023-01-11 14:50:10 +01002409 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002410}
2411
Gilles Peskineeccd8882020-03-10 12:19:08 +01002412#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002413MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002414static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002415{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002416 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002417 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002418
Gilles Peskine449bd832023-01-11 14:50:10 +01002419 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002420
Gilles Peskine449bd832023-01-11 14:50:10 +01002421 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2422 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002423 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002424 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002425 }
2426
Gilles Peskine449bd832023-01-11 14:50:10 +01002427 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2428 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002429}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002430#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002431MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002432static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002433{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002434 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002435 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002436 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002437 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002438 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002439 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002440 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002441 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002442 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002443
Gilles Peskine449bd832023-01-11 14:50:10 +01002444 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002445
2446 ssl->state++;
2447
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002448#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002449 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002450 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002451 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002452#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002453 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002454
Gilles Peskine449bd832023-01-11 14:50:10 +01002455 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2456 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2457 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2458 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002459 }
2460
2461 /*
2462 * 0 . 0 handshake type
2463 * 1 . 3 handshake length
2464 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002465 * 5 .. m-1 cert types
2466 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002467 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002468 * n .. n+1 length of all DNs
2469 * n+2 .. n+3 length of DN 1
2470 * n+4 .. ... Distinguished Name #1
2471 * ... .. ... length of DN 2, etc.
2472 */
2473 buf = ssl->out_msg;
2474 p = buf + 4;
2475
2476 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002477 * Supported certificate types
2478 *
2479 * ClientCertificateType certificate_types<1..2^8-1>;
2480 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002481 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002482 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002483
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002484#if defined(MBEDTLS_RSA_C)
2485 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002486#endif
Valerio Setti45d56f32023-07-13 17:23:20 +02002487#if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002488 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002489#endif
2490
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002491 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002492 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002493
Paul Bakker577e0062013-08-28 11:57:20 +02002494 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002495
Paul Bakker926af752012-11-23 13:38:07 +01002496 /*
2497 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002498 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002499 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2500 *
2501 * struct {
2502 * HashAlgorithm hash;
2503 * SignatureAlgorithm signature;
2504 * } SignatureAndHashAlgorithm;
2505 *
2506 * enum { (255) } HashAlgorithm;
2507 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002508 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002509 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2510 if (sig_alg == NULL) {
2511 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2512 }
Ronald Cron8457c122022-03-07 11:32:54 +01002513
Gilles Peskine449bd832023-01-11 14:50:10 +01002514 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2515 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002516
Gilles Peskine449bd832023-01-11 14:50:10 +01002517 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002518 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002519 }
2520 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002521 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002522 }
Simon Butcher99000142016-10-13 17:21:01 +01002523
Paul Elliott96a0fd92022-11-08 17:09:56 +00002524 /* Write elements at offsets starting from 1 (offset 0 is for the
2525 * length). Thus the offset of each element is the length of the
2526 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002527 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002528 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002529
Paul Bakker926af752012-11-23 13:38:07 +01002530 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002531
Paul Elliott96a0fd92022-11-08 17:09:56 +00002532 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002533 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002534 sa_len += 2;
2535 p += sa_len;
2536
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002537 /*
2538 * DistinguishedName certificate_authorities<0..2^16-1>;
2539 * opaque DistinguishedName<1..2^16-1>;
2540 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002541 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002542
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002543 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002544
Gilles Peskine449bd832023-01-11 14:50:10 +01002545 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002546 /* NOTE: If trusted certificates are provisioned
2547 * via a CA callback (configured through
2548 * `mbedtls_ssl_conf_ca_cb()`, then the
2549 * CertificateRequest is currently left empty. */
2550
Glenn Strauss999ef702022-03-11 01:37:23 -05002551#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2552#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002553 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002554 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002555 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002556#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002557 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002558 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002559 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002560#endif
Janos Follath088ce432017-04-10 12:42:31 +01002561#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002562 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002563 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002564 } else
Janos Follath088ce432017-04-10 12:42:31 +01002565#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002566 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002567
Gilles Peskine449bd832023-01-11 14:50:10 +01002568 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002569 /* It follows from RFC 5280 A.1 that this length
2570 * can be represented in at most 11 bits. */
2571 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002572
Gilles Peskine449bd832023-01-11 14:50:10 +01002573 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2574 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002575 break;
2576 }
2577
Gilles Peskine449bd832023-01-11 14:50:10 +01002578 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002579 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002580 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002581 p += dn_size;
2582
Gilles Peskine449bd832023-01-11 14:50:10 +01002583 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002584
2585 total_dn_size += 2 + dn_size;
2586 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002587 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002588 }
2589
Paul Bakker926af752012-11-23 13:38:07 +01002590 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002591 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2592 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002593 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002594
Gilles Peskine449bd832023-01-11 14:50:10 +01002595 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002596
Gilles Peskine449bd832023-01-11 14:50:10 +01002597 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002598
Gilles Peskine449bd832023-01-11 14:50:10 +01002599 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002600}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002601#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002602
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002603#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +01002604 (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2605 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002606MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002607static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002608{
2609 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2610 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002611 mbedtls_pk_context *pk;
2612 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002613 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002614#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002615 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002616 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002617 size_t key_len;
Valerio Setti97207782023-05-18 18:59:06 +02002618 mbedtls_ecp_group_id grp_id;
Valerio Setti3589a4c2023-06-22 09:02:44 +02002619 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
Valerio Setti0813b6f2023-06-16 12:18:53 +02002620 mbedtls_ecp_keypair *key;
2621#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002622
Gilles Peskine449bd832023-01-11 14:50:10 +01002623 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002624
Gilles Peskine449bd832023-01-11 14:50:10 +01002625 if (pk == NULL) {
2626 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2627 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002628
Valerio Setti0813b6f2023-06-16 12:18:53 +02002629 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002630
Valerio Setti0813b6f2023-06-16 12:18:53 +02002631 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002632 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002633#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2634 case MBEDTLS_PK_ECKEY:
2635 case MBEDTLS_PK_ECKEY_DH:
2636 case MBEDTLS_PK_ECDSA:
2637#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002638 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2639 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2640 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002641
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002642 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
Neil Armstronge88d1902022-04-04 11:25:23 +02002643
Przemek Stekiel6f199852023-06-29 08:59:26 +02002644 /* Key should not be destroyed in the TLS library */
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002645 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Przemek Stekiel6f199852023-06-29 08:59:26 +02002646
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002647 status = psa_get_key_attributes(ssl->handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002648 &key_attributes);
2649 if (status != PSA_SUCCESS) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002650 ssl->handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002651 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002652 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002653
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002654 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
Valerio Settiea59c432023-07-25 11:14:03 +02002655 ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002656
Gilles Peskine449bd832023-01-11 14:50:10 +01002657 psa_reset_key_attributes(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002658
Gilles Peskine449bd832023-01-11 14:50:10 +01002659 ret = 0;
2660 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002661#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002662 case MBEDTLS_PK_ECKEY:
2663 case MBEDTLS_PK_ECKEY_DH:
2664 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002665 key = mbedtls_pk_ec_rw(*pk);
Valerio Settid0405092023-05-24 13:16:40 +02002666 grp_id = mbedtls_pk_get_group_id(pk);
2667 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002668 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2669 }
Valerio Setti97207782023-05-18 18:59:06 +02002670 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002671 if (tls_id == 0) {
2672 /* This elliptic curve is not supported */
2673 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2674 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002675
Gilles Peskine449bd832023-01-11 14:50:10 +01002676 /* If the above conversion to TLS ID was fine, then also this one will
2677 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002678 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Valerio Settiea59c432023-07-25 11:14:03 +02002679 &ssl->handshake->xxdh_psa_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002680
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002681 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002682
Gilles Peskine449bd832023-01-11 14:50:10 +01002683 key_attributes = psa_key_attributes_init();
2684 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2685 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2686 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002687 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
Valerio Settiea59c432023-07-25 11:14:03 +02002688 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002689
Gilles Peskine449bd832023-01-11 14:50:10 +01002690 key_len = PSA_BITS_TO_BYTES(key->grp.pbits);
2691 ret = mbedtls_ecp_write_key(key, buf, key_len);
2692 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002693 mbedtls_platform_zeroize(buf, sizeof(buf));
2694 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002695 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002696
Gilles Peskine449bd832023-01-11 14:50:10 +01002697 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002698 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002699 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002700 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002701 mbedtls_platform_zeroize(buf, sizeof(buf));
2702 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002703 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002704
Valerio Setti6835b4a2023-06-22 09:06:31 +02002705 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002706 ret = 0;
2707 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002708#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002709 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002710 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002711 }
2712
Gilles Peskine449bd832023-01-11 14:50:10 +01002713 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002714}
2715#elif defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002716 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002717MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002718static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002719{
Janos Follath865b3eb2019-12-16 11:46:15 +00002720 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002721
Gilles Peskine449bd832023-01-11 14:50:10 +01002722 const mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
2723 if (private_key == NULL) {
2724 MBEDTLS_SSL_DEBUG_MSG(1, ("got no server private key"));
2725 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Leonid Rozenboim28752702022-04-21 18:00:52 -07002726 }
2727
Gilles Peskine449bd832023-01-11 14:50:10 +01002728 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_ECKEY)) {
2729 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2730 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002731 }
2732
Gilles Peskine449bd832023-01-11 14:50:10 +01002733 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
Valerio Setti77a75682023-05-15 11:18:46 +02002734 mbedtls_pk_ec_ro(*mbedtls_ssl_own_key(ssl)),
Gilles Peskine449bd832023-01-11 14:50:10 +01002735 MBEDTLS_ECDH_OURS)) != 0) {
2736 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2737 return ret;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002738 }
2739
Gilles Peskine449bd832023-01-11 14:50:10 +01002740 return 0;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002741}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002742#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2743 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002744
Gilles Peskineeccd8882020-03-10 12:19:08 +01002745#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002746 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002747MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002748static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2749 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002750{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002751 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2752 * signature length which will be added in ssl_write_server_key_exchange
2753 * after the call to ssl_prepare_server_key_exchange.
2754 * ssl_write_server_key_exchange also takes care of incrementing
2755 * ssl->out_msglen. */
2756 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002757 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2758 - sig_start);
2759 int ret = ssl->conf->f_async_resume(ssl,
2760 sig_start, signature_len, sig_max_len);
2761 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002762 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002763 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002764 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002765 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2766 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002767}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002768#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002769 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002770
Gilles Peskined3eb0612018-01-08 17:07:44 +01002771/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002772 * calculating the signature if any, but excluding formatting the
2773 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002774MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002775static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2776 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002777{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002778 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002779 ssl->handshake->ciphersuite_info;
2780
Gilles Peskineeccd8882020-03-10 12:19:08 +01002781#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002782#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002783 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002784#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002785#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002786
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002787 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002788#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002789 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002790#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002791
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002792#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002793#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002794 size_t out_buf_len = ssl->out_buf_len - (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002795#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002796 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN - (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002797#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002798#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002799
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002800 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002801
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002802 /*
2803 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002804 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002805 *
2806 */
2807
2808 /*
2809 * - ECJPAKE key exchanges
2810 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002811#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002812 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002813 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002814#if defined(MBEDTLS_USE_PSA_CRYPTO)
2815 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2816 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2817 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002818 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002819 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002820
Valerio Setti6f1b5742022-11-16 10:00:32 +01002821 /*
2822 * The first 3 bytes are:
2823 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2824 * [1, 2] elliptic curve's TLS ID
2825 *
2826 * However since we only support secp256r1 for now, we hardcode its
2827 * TLS ID here
2828 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002829 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002830 MBEDTLS_ECP_DP_SECP256R1);
2831 if (tls_id == 0) {
2832 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002833 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002834 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002835 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002836 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002837
Gilles Peskine449bd832023-01-11 14:50:10 +01002838 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2839 out_p + output_offset,
2840 end_p - out_p - output_offset, &output_len,
2841 MBEDTLS_ECJPAKE_ROUND_TWO);
2842 if (ret != 0) {
2843 psa_destroy_key(ssl->handshake->psa_pake_password);
2844 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2845 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2846 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002847 }
2848
Valerio Setti02c25b52022-11-15 14:08:42 +01002849 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002850 ssl->out_msglen += output_offset;
2851#else
Simon Butcher600c5e62018-06-14 08:58:59 +01002852 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002853
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002854 ret = mbedtls_ecjpake_write_round_two(
2855 &ssl->handshake->ecjpake_ctx,
2856 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10002857 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Gilles Peskine449bd832023-01-11 14:50:10 +01002858 ssl->conf->f_rng, ssl->conf->p_rng);
2859 if (ret != 0) {
2860 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2861 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002862 }
2863
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002864 ssl->out_msglen += len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002865#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002866 }
2867#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2868
Hanno Becker1aa267c2017-04-28 17:08:27 +01002869 /*
2870 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2871 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2872 * we use empty support identity hints here.
2873 **/
2874#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002875 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002876 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2877 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002878 ssl->out_msg[ssl->out_msglen++] = 0x00;
2879 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002880 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002881#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2882 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002883
Hanno Becker7e5437a2017-04-28 17:15:26 +01002884 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002885 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002886 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002887#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002888 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002889 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002890 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002891
Gilles Peskine449bd832023-01-11 14:50:10 +01002892 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2893 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2894 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002895 }
2896
Paul Bakker41c83d32013-03-20 14:39:14 +01002897 /*
2898 * Ephemeral DH parameters:
2899 *
2900 * struct {
2901 * opaque dh_p<1..2^16-1>;
2902 * opaque dh_g<1..2^16-1>;
2903 * opaque dh_Ys<1..2^16-1>;
2904 * } ServerDHParams;
2905 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002906 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2907 &ssl->conf->dhm_P,
2908 &ssl->conf->dhm_G)) != 0) {
2909 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2910 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002911 }
Paul Bakker48916f92012-09-16 19:57:18 +00002912
Gilles Peskine449bd832023-01-11 14:50:10 +01002913 if ((ret = mbedtls_dhm_make_params(
2914 &ssl->handshake->dhm_ctx,
2915 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2916 ssl->out_msg + ssl->out_msglen, &len,
2917 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2918 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2919 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002920 }
2921
Jerry Yuc5aef882021-12-23 20:15:02 +08002922#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002923 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002924#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002925
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002926 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002927
Gilles Peskine449bd832023-01-11 14:50:10 +01002928 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2929 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2930 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2931 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002932 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002933#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002934
Hanno Becker1aa267c2017-04-28 17:08:27 +01002935 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002936 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002937 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002938#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002939 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002940 /*
2941 * Ephemeral ECDH parameters:
2942 *
2943 * struct {
2944 * ECParameters curve_params;
2945 * ECPoint public;
2946 * } ServerECDHParams;
2947 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002948 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002949 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
Janos Follath865b3eb2019-12-16 11:46:15 +00002950 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002951 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002952
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002953 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002954 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2955 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2956 }
2957 for (; *group_list != 0; group_list++) {
2958 for (curr_tls_id = ssl->handshake->curves_tls_id;
2959 *curr_tls_id != 0; curr_tls_id++) {
2960 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002961 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002962 }
2963 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002964 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002965
Gilles Peskine449bd832023-01-11 14:50:10 +01002966curve_matching_done:
2967 if (*curr_tls_id == 0) {
2968 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2969 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2970 }
2971
2972 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2973 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002974
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002975#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrongd91526c2022-04-12 14:38:52 +02002976 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2977 psa_key_attributes_t key_attributes;
2978 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002979 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2980 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2981 // data length(1)
2982 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002983 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002984 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002985
Gilles Peskine449bd832023-01-11 14:50:10 +01002986 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002987
Valerio Setti40d9ca92023-01-04 16:08:04 +01002988 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002989 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002990 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002991 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2992 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2993 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002994 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002995 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02002996 handshake->xxdh_psa_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002997
2998 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002999 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
3000 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003001 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02003002 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003003
3004 /*
3005 * ECParameters curve_params
3006 *
3007 * First byte is curve_type, always named_curve
3008 */
3009 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
3010
3011 /*
3012 * Next two bytes are the namedcurve value
3013 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003014 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003015 p += 2;
3016
3017 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003018 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003019 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003020 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003021 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003022 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
3023 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003024 }
3025
3026 /*
3027 * ECPoint public
3028 *
3029 * First byte is data length.
3030 * It will be filled later. p holds now the data length location.
3031 */
3032
3033 /* Export the public part of the ECDH private key from PSA.
3034 * Make one byte space for the length.
3035 */
3036 unsigned char *own_pubkey = p + data_length_size;
3037
Gilles Peskine449bd832023-01-11 14:50:10 +01003038 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
3039 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003040
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003041 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01003042 own_pubkey, own_pubkey_max_len,
3043 &len);
3044 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003045 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003046 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003047 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3048 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003049 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003050 }
3051
3052 /* Store the length of the exported public key. */
3053 *p = (uint8_t) len;
3054
3055 /* Determine full message length. */
3056 len += header_size;
3057#else
Valerio Setti18c9fed2022-12-30 17:44:24 +01003058 mbedtls_ecp_group_id curr_grp_id =
Gilles Peskine449bd832023-01-11 14:50:10 +01003059 mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
Valerio Setti18c9fed2022-12-30 17:44:24 +01003060
Gilles Peskine449bd832023-01-11 14:50:10 +01003061 if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
3062 curr_grp_id)) != 0) {
3063 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
3064 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003065 }
3066
Gilles Peskine449bd832023-01-11 14:50:10 +01003067 if ((ret = mbedtls_ecdh_make_params(
3068 &ssl->handshake->ecdh_ctx, &len,
3069 ssl->out_msg + ssl->out_msglen,
3070 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
3071 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3072 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
3073 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003074 }
3075
Gilles Peskine449bd832023-01-11 14:50:10 +01003076 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3077 MBEDTLS_DEBUG_ECDH_Q);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003078#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker41c83d32013-03-20 14:39:14 +01003079
Jerry Yuc5aef882021-12-23 20:15:02 +08003080#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003081 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003082#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003083
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003084 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01003085 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003086#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003087
Hanno Becker1aa267c2017-04-28 17:08:27 +01003088 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003089 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003090 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003091 * exchange parameters, compute and add the signature here.
3092 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003093 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003094#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003095 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3096 if (dig_signed == NULL) {
3097 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3098 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01003099 }
3100
Gilles Peskine1004c192018-01-08 16:59:14 +01003101 size_t dig_signed_len = ssl->out_msg + ssl->out_msglen - dig_signed;
Gilles Peskineca1d7422018-04-24 11:53:22 +02003102 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003103 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003104
Janos Follath865b3eb2019-12-16 11:46:15 +00003105 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003106
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003107 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003108 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003109 * For TLS 1.2, obey signature-hash-algorithm extension
3110 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003111 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003112
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003113 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003114 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003115
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003116 unsigned int sig_hash =
3117 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003118 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003119
Gilles Peskine449bd832023-01-11 14:50:10 +01003120 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003121
Ronald Cron8457c122022-03-07 11:32:54 +01003122 /* For TLS 1.2, obey signature-hash-algorithm extension
3123 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003124 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3125 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003126 /* (... because we choose a cipher suite
3127 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003128 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003129 }
3130
Gilles Peskine449bd832023-01-11 14:50:10 +01003131 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003132
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003133 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003134 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003135 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003136 if (md_alg != MBEDTLS_MD_NONE) {
3137 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3138 dig_signed,
3139 dig_signed_len,
3140 md_alg);
3141 if (ret != 0) {
3142 return ret;
3143 }
3144 } else {
3145 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3146 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003147 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003148
Gilles Peskine449bd832023-01-11 14:50:10 +01003149 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003150
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003151 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003152 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003153 */
Ronald Cron8457c122022-03-07 11:32:54 +01003154 /*
3155 * We need to specify signature and hash algorithm explicitly through
3156 * a prefix to the signature.
3157 *
3158 * struct {
3159 * HashAlgorithm hash;
3160 * SignatureAlgorithm signature;
3161 * } SignatureAndHashAlgorithm;
3162 *
3163 * struct {
3164 * SignatureAndHashAlgorithm algorithm;
3165 * opaque signature<0..2^16-1>;
3166 * } DigitallySigned;
3167 *
3168 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003169
Gilles Peskine449bd832023-01-11 14:50:10 +01003170 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3171 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003172
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003173#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003174 if (ssl->conf->f_async_sign_start != NULL) {
3175 ret = ssl->conf->f_async_sign_start(ssl,
3176 mbedtls_ssl_own_cert(ssl),
3177 md_alg, hash, hashlen);
3178 switch (ret) {
3179 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3180 /* act as if f_async_sign was null */
3181 break;
3182 case 0:
3183 ssl->handshake->async_in_progress = 1;
3184 return ssl_resume_server_key_exchange(ssl, signature_len);
3185 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3186 ssl->handshake->async_in_progress = 1;
3187 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3188 default:
3189 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3190 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003191 }
3192 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003193#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003194
Gilles Peskine449bd832023-01-11 14:50:10 +01003195 if (mbedtls_ssl_own_key(ssl) == NULL) {
3196 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3197 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003198 }
3199
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003200 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3201 * signature length which will be added in ssl_write_server_key_exchange
3202 * after the call to ssl_prepare_server_key_exchange.
3203 * ssl_write_server_key_exchange also takes care of incrementing
3204 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003205 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3206 md_alg, hash, hashlen,
3207 ssl->out_msg + ssl->out_msglen + 2,
3208 out_buf_len - ssl->out_msglen - 2,
3209 signature_len,
3210 ssl->conf->f_rng,
3211 ssl->conf->p_rng)) != 0) {
3212 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3213 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003214 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003215 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003216#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003217
Gilles Peskine449bd832023-01-11 14:50:10 +01003218 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003219}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003220
Gilles Peskined3eb0612018-01-08 17:07:44 +01003221/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003222 * that do not include a ServerKeyExchange message, do nothing. Either
3223 * way, if successful, move on to the next step in the SSL state
3224 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003225MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003226static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003227{
Janos Follath865b3eb2019-12-16 11:46:15 +00003228 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003229 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003230#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003231 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003232 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003233#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003234
Gilles Peskine449bd832023-01-11 14:50:10 +01003235 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003236
Gilles Peskineeccd8882020-03-10 12:19:08 +01003237#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003238 /* Extract static ECDH parameters and abort if ServerKeyExchange
3239 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003240 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003241 /* For suites involving ECDH, extract DH parameters
3242 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003243#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003244 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3245 ret = ssl_get_ecdh_params_from_cert(ssl);
3246 if (ret != 0) {
3247 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3248 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003249 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003250 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003251#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003252
3253 /* Key exchanges not involving ephemeral keys don't use
3254 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003255 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003256 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003257 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003258 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003259#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003260
Gilles Peskineeccd8882020-03-10 12:19:08 +01003261#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003262 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003263 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003264 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003265 if (ssl->handshake->async_in_progress != 0) {
3266 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3267 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3268 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003269#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003270 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003271 {
3272 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003273 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003274 }
3275
Gilles Peskine449bd832023-01-11 14:50:10 +01003276 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003277 /* If we're starting to write a new message, set ssl->out_msglen
3278 * to 0. But if we're resuming after an asynchronous message,
3279 * out_msglen is the amount of data written so far and mst be
3280 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003281 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3282 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3283 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003284 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003285 }
3286 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003287 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003288
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003289 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003290 * ssl_prepare_server_key_exchange already wrote the signature
3291 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003292#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003293 if (signature_len != 0) {
3294 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3295 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003296
Gilles Peskine449bd832023-01-11 14:50:10 +01003297 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3298 ssl->out_msg + ssl->out_msglen,
3299 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003300
3301 /* Skip over the already-written signature */
3302 ssl->out_msglen += signature_len;
3303 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003304#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003305
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003306 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003307 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3308 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003309
3310 ssl->state++;
3311
Gilles Peskine449bd832023-01-11 14:50:10 +01003312 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3313 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3314 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003315 }
3316
Gilles Peskine449bd832023-01-11 14:50:10 +01003317 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3318 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003319}
3320
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003321MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003322static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003323{
Janos Follath865b3eb2019-12-16 11:46:15 +00003324 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003325
Gilles Peskine449bd832023-01-11 14:50:10 +01003326 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003327
3328 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003329 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3330 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003331
3332 ssl->state++;
3333
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003334#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003335 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3336 mbedtls_ssl_send_flight_completed(ssl);
3337 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003338#endif
3339
Gilles Peskine449bd832023-01-11 14:50:10 +01003340 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3341 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3342 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003343 }
3344
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003345#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003346 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3347 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3348 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3349 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003350 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003351#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003352
Gilles Peskine449bd832023-01-11 14:50:10 +01003353 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003354
Gilles Peskine449bd832023-01-11 14:50:10 +01003355 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003356}
3357
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003358#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3359 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003360MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003361static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3362 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003363{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003364 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003365 size_t n;
3366
3367 /*
3368 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3369 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003370 if (*p + 2 > end) {
3371 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3372 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003373 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003374
Gilles Peskine449bd832023-01-11 14:50:10 +01003375 n = ((*p)[0] << 8) | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003376 *p += 2;
3377
Gilles Peskine449bd832023-01-11 14:50:10 +01003378 if (*p + n > end) {
3379 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3380 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003381 }
3382
Gilles Peskine449bd832023-01-11 14:50:10 +01003383 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3384 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3385 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003386 }
3387
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003388 *p += n;
3389
Gilles Peskine449bd832023-01-11 14:50:10 +01003390 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003391
Gilles Peskine449bd832023-01-11 14:50:10 +01003392 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003393}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003394#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3395 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003396
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003397#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3398 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003399
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003400#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003401MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003402static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3403 unsigned char *peer_pms,
3404 size_t *peer_pmslen,
3405 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003406{
Gilles Peskine449bd832023-01-11 14:50:10 +01003407 int ret = ssl->conf->f_async_resume(ssl,
3408 peer_pms, peer_pmslen, peer_pmssize);
3409 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003410 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003411 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003412 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003413 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3414 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003415}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003416#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003417
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003418MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003419static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3420 const unsigned char *p,
3421 const unsigned char *end,
3422 unsigned char *peer_pms,
3423 size_t *peer_pmslen,
3424 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003425{
Janos Follath865b3eb2019-12-16 11:46:15 +00003426 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003427
Gilles Peskine449bd832023-01-11 14:50:10 +01003428 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3429 if (own_cert == NULL) {
3430 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3431 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003432 }
3433 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003434 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3435 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003436
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003437#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003438 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003439 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003440 if (ssl->handshake->async_in_progress != 0) {
3441 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3442 return ssl_resume_decrypt_pms(ssl,
3443 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003444 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003445#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003446
3447 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003448 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003449 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003450 if (p + 2 > end) {
3451 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3452 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003453 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003454 if (*p++ != MBEDTLS_BYTE_1(len) ||
3455 *p++ != MBEDTLS_BYTE_0(len)) {
3456 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3457 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003458 }
3459
Gilles Peskine449bd832023-01-11 14:50:10 +01003460 if (p + len != end) {
3461 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3462 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003463 }
3464
Gilles Peskine422ccab2018-01-11 18:29:01 +01003465 /*
3466 * Decrypt the premaster secret
3467 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003468#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003469 if (ssl->conf->f_async_decrypt_start != NULL) {
3470 ret = ssl->conf->f_async_decrypt_start(ssl,
3471 mbedtls_ssl_own_cert(ssl),
3472 p, len);
3473 switch (ret) {
3474 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3475 /* act as if f_async_decrypt_start was null */
3476 break;
3477 case 0:
3478 ssl->handshake->async_in_progress = 1;
3479 return ssl_resume_decrypt_pms(ssl,
3480 peer_pms,
3481 peer_pmslen,
3482 peer_pmssize);
3483 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3484 ssl->handshake->async_in_progress = 1;
3485 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3486 default:
3487 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3488 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003489 }
3490 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003491#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003492
Gilles Peskine449bd832023-01-11 14:50:10 +01003493 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3494 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3495 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003496 }
3497
Gilles Peskine449bd832023-01-11 14:50:10 +01003498 ret = mbedtls_pk_decrypt(private_key, p, len,
3499 peer_pms, peer_pmslen, peer_pmssize,
3500 ssl->conf->f_rng, ssl->conf->p_rng);
3501 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003502}
3503
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003504MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003505static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3506 const unsigned char *p,
3507 const unsigned char *end,
3508 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003509{
Janos Follath865b3eb2019-12-16 11:46:15 +00003510 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003511 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3512 unsigned char ver[2];
3513 unsigned char fake_pms[48], peer_pms[48];
Dave Rodgman293eedd2023-05-17 12:31:36 +01003514 size_t peer_pmslen;
3515 mbedtls_ct_condition_t diff;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003516
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003517 /* In case of a failure in decryption, the decryption may write less than
3518 * 2 bytes of output, but we always read the first two bytes. It doesn't
3519 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003520 * ret being nonzero, and we only care whether diff is 0.
3521 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3522 * also makes memory analyzers happy (don't access uninitialized memory,
3523 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003524 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003525 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003526
Gilles Peskine449bd832023-01-11 14:50:10 +01003527 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3528 peer_pms,
3529 &peer_pmslen,
3530 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003531
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003532#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003533 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3534 return ret;
3535 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003536#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003537
Gilles Peskine449bd832023-01-11 14:50:10 +01003538 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3539 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003540
3541 /* Avoid data-dependent branches while checking for invalid
3542 * padding, to protect against timing-based Bleichenbacher-type
3543 * attacks. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003544 diff = mbedtls_ct_bool(ret);
Dave Rodgmanb7825ce2023-08-10 11:58:18 +01003545 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pmslen, 48));
3546 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[0], ver[0]));
3547 diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[1], ver[1]));
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003548
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003549 /*
3550 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3551 * must not cause the connection to end immediately; instead, send a
3552 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003553 * To protect against timing-based variants of the attack, we must
3554 * not have any branch that depends on whether the decryption was
3555 * successful. In particular, always generate the fake premaster secret,
3556 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003557 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003558 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3559 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003560 /* It's ok to abort on an RNG failure, since this does not reveal
3561 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003562 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003563 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003564
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003565#if defined(MBEDTLS_SSL_DEBUG_ALL)
Dave Rodgman293eedd2023-05-17 12:31:36 +01003566 if (diff != MBEDTLS_CT_FALSE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003567 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3568 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003569#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003570
Gilles Peskine449bd832023-01-11 14:50:10 +01003571 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3572 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3573 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3574 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003575 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003576 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003577
Gilles Peskine422ccab2018-01-11 18:29:01 +01003578 /* Set pms to either the true or the fake PMS, without
3579 * data-dependent branches. */
Dave Rodgman293eedd2023-05-17 12:31:36 +01003580 mbedtls_ct_memcpy_if(diff, pms, fake_pms, peer_pms, ssl->handshake->pmslen);
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003581
Gilles Peskine449bd832023-01-11 14:50:10 +01003582 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003583}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003584#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
3585 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003586
Gilles Peskineeccd8882020-03-10 12:19:08 +01003587#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003588MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003589static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3590 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003591{
Paul Bakker6db455e2013-09-18 17:29:31 +02003592 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003593 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003594
Gilles Peskine449bd832023-01-11 14:50:10 +01003595 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3596 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3597 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003598 }
3599
3600 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003601 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003602 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003603 if (end - *p < 2) {
3604 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3605 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003606 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003607
Gilles Peskine449bd832023-01-11 14:50:10 +01003608 n = ((*p)[0] << 8) | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003609 *p += 2;
3610
Gilles Peskine449bd832023-01-11 14:50:10 +01003611 if (n == 0 || n > end - *p) {
3612 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3613 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003614 }
3615
Gilles Peskine449bd832023-01-11 14:50:10 +01003616 if (ssl->conf->f_psk != NULL) {
3617 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003618 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003619 }
3620 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003621 /* Identity is not a big secret since clients send it in the clear,
3622 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003623 if (n != ssl->conf->psk_identity_len ||
3624 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003625 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003626 }
3627 }
3628
Gilles Peskine449bd832023-01-11 14:50:10 +01003629 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3630 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3631 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3632 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3633 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003634 }
3635
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003636 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003637
Gilles Peskine449bd832023-01-11 14:50:10 +01003638 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003639}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003640#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003641
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003642MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003643static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003644{
Janos Follath865b3eb2019-12-16 11:46:15 +00003645 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003646 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003647 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003648
Hanno Beckere694c3e2017-12-27 21:34:08 +00003649 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003650
Gilles Peskine449bd832023-01-11 14:50:10 +01003651 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003652
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003653#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskine449bd832023-01-11 14:50:10 +01003654 (defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3655 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED))
3656 if ((ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3657 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) &&
3658 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003659 /* We've already read a record and there is an asynchronous
3660 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003661 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003662 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3663 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003664#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003665 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3666 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3667 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003668 }
3669
Gilles Peskine449bd832023-01-11 14:50:10 +01003670 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003671 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003672
Gilles Peskine449bd832023-01-11 14:50:10 +01003673 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3674 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3675 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003676 }
3677
Gilles Peskine449bd832023-01-11 14:50:10 +01003678 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3679 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3680 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003681 }
3682
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003683#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003684 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3685 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3686 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3687 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003688 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003689
Gilles Peskine449bd832023-01-11 14:50:10 +01003690 if (p != end) {
3691 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3692 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003693 }
3694
Gilles Peskine449bd832023-01-11 14:50:10 +01003695 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3696 ssl->handshake->premaster,
3697 MBEDTLS_PREMASTER_SIZE,
3698 &ssl->handshake->pmslen,
3699 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3700 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3701 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003702 }
3703
Gilles Peskine449bd832023-01-11 14:50:10 +01003704 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3705 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003706#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003707#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3708 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3709 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3710 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003711 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003712 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3713 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003714 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003715#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003716 size_t data_len = (size_t) (*p++);
3717 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003718 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3719 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3720
Gilles Peskine449bd832023-01-11 14:50:10 +01003721 MBEDTLS_SSL_DEBUG_MSG(1, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003722
3723 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003724 * We must have at least two bytes (1 for length, at least 1 for data)
3725 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003726 if (buf_len < 2) {
3727 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length"));
3728 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003729 }
3730
Gilles Peskine449bd832023-01-11 14:50:10 +01003731 if (data_len < 1 || data_len > buf_len) {
3732 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length"));
3733 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003734 }
3735
3736 /* Store peer's ECDH public key. */
Gilles Peskinec8df8982023-10-02 14:58:16 +02003737 MBEDTLS_SSL_DEBUG_MSG(3, ("data_len=%zu sizeof(handshake->xxdh_psa_peerkey)=%zu", data_len, sizeof(handshake->xxdh_psa_peerkey)));
3738 if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
3739 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length"));
3740 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3741 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003742 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3743 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003744
3745 /* Compute ECDH shared secret. */
3746 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003747 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3748 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003749 handshake->premaster, sizeof(handshake->premaster),
3750 &handshake->pmslen);
3751 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003752 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003753 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003754 if (handshake->xxdh_psa_privkey_is_external == 0) {
3755 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003756 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003757 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003758 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003759 }
3760
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003761 if (handshake->xxdh_psa_privkey_is_external == 0) {
3762 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003763
Gilles Peskine449bd832023-01-11 14:50:10 +01003764 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003765 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003766 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3767 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003768 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003769 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003770 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003771#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003772 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
3773 p, end - p)) != 0) {
3774 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3775 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003776 }
3777
Gilles Peskine449bd832023-01-11 14:50:10 +01003778 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3779 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003780
Gilles Peskine449bd832023-01-11 14:50:10 +01003781 if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
3782 &ssl->handshake->pmslen,
3783 ssl->handshake->premaster,
3784 MBEDTLS_MPI_MAX_SIZE,
3785 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3786 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3787 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003788 }
3789
Gilles Peskine449bd832023-01-11 14:50:10 +01003790 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3791 MBEDTLS_DEBUG_ECDH_Z);
Neil Armstrong913b3642022-04-13 14:59:48 +02003792#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003793 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003794#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3795 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3796 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3797 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3798#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003799 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3800 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3801 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3802 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003803 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003804
Gilles Peskine449bd832023-01-11 14:50:10 +01003805 if (p != end) {
3806 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3807 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003808 }
3809
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003810#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003811 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003812 (mbedtls_key_exchange_type_t) ciphersuite_info->
3813 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003814 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3815 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003816 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003817#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003818 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003819#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
3820#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003821 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003822#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003823 if (ssl->handshake->async_in_progress != 0) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003824 /* There is an asynchronous operation in progress to
3825 * decrypt the encrypted premaster secret, so skip
3826 * directly to resuming this operation. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003827 MBEDTLS_SSL_DEBUG_MSG(3, ("PSK identity already parsed"));
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003828 /* Update p to skip the PSK identity. ssl_parse_encrypted_pms
3829 * won't actually use it, but maintain p anyway for robustness. */
3830 p += ssl->conf->psk_identity_len + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01003831 } else
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003832#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003833 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3834 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3835 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003836 }
3837
Gilles Peskine449bd832023-01-11 14:50:10 +01003838 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 2)) != 0) {
3839 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_encrypted_pms"), ret);
3840 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003841 }
3842
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003843#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003844 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003845 (mbedtls_key_exchange_type_t) ciphersuite_info->
3846 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003847 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3848 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003849 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003850#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003851 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003852#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3853#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003854 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3855 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3856 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3857 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003858 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003859 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3860 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3861 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003862 }
3863
Gilles Peskine449bd832023-01-11 14:50:10 +01003864 if (p != end) {
3865 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3866 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003867 }
3868
Neil Armstrong80f6f322022-05-03 17:56:38 +02003869#if defined(MBEDTLS_USE_PSA_CRYPTO)
3870 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003871 unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003872 size_t pms_len;
3873
3874 /* Write length only when we know the actual value */
Gilles Peskine449bd832023-01-11 14:50:10 +01003875 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3876 pms + 2, pms_end - (pms + 2), &pms_len,
3877 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3878 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3879 return ret;
Neil Armstrong80f6f322022-05-03 17:56:38 +02003880 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003881 MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003882 pms += 2 + pms_len;
3883
Gilles Peskine449bd832023-01-11 14:50:10 +01003884 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003885#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003886 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003887 (mbedtls_key_exchange_type_t) ciphersuite_info->
3888 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003889 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3890 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003891 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003892#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003893 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003894#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003895#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003896 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003897#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrong039db292022-03-09 11:38:34 +01003898 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3899 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
3900 uint8_t ecpoint_len;
3901
3902 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3903
Gilles Peskine449bd832023-01-11 14:50:10 +01003904 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3905 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003906 psa_destroy_key(handshake->xxdh_psa_privkey);
3907 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003908 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003909 }
3910
3911 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003912 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003913 psa_destroy_key(handshake->xxdh_psa_privkey);
3914 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003915 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003916 }
3917
Neil Armstrong039db292022-03-09 11:38:34 +01003918 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003919 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003920 psa_destroy_key(handshake->xxdh_psa_privkey);
3921 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003922 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003923 }
3924
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003925 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3926 the sizes of the FFDH keys which are at least 2048 bits.
3927 The size of the array is thus greater than 256 bytes which is greater than any
3928 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003929#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003930 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3931 psa_destroy_key(handshake->xxdh_psa_privkey);
3932 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003933 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003934 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003935#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003936 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3937 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003938#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003939
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003940 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3941 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003942 p += ecpoint_len;
3943
Neil Armstrong3bcef082022-03-23 18:16:54 +01003944 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003945 * - a uint16 containing the length (in octets) of the ECDH computation
3946 * - the octet string produced by the ECDH computation
3947 * - a uint16 containing the length (in octets) of the PSK
3948 * - the PSK itself
3949 */
Neil Armstrong039db292022-03-09 11:38:34 +01003950 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003951 const unsigned char * const psm_end =
3952 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003953 /* uint16 to store length (in octets) of the ECDH computation */
3954 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003955 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003956
3957 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003958 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003959 handshake->xxdh_psa_privkey,
3960 handshake->xxdh_psa_peerkey,
3961 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003962 psm + zlen_size,
3963 psm_end - (psm + zlen_size),
3964 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003965
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003966 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3967 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003968
Gilles Peskine449bd832023-01-11 14:50:10 +01003969 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003970 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003971 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003972 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003973 }
Neil Armstrong039db292022-03-09 11:38:34 +01003974
Neil Armstrong3bcef082022-03-23 18:16:54 +01003975 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003976 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003977 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003978
Przemek Stekiel14d11b02022-04-14 08:33:29 +02003979#else /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003980 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3981 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3982 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003983 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003984
Gilles Peskine449bd832023-01-11 14:50:10 +01003985 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
3986 p, end - p)) != 0) {
3987 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3988 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003989 }
3990
Gilles Peskine449bd832023-01-11 14:50:10 +01003991 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3992 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003993
Gilles Peskine449bd832023-01-11 14:50:10 +01003994 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
Agathiyan Bragadeesh8b52b882023-07-13 13:12:40 +01003995 (mbedtls_key_exchange_type_t) ciphersuite_info->
3996 key_exchange)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01003997 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3998 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003999 }
Neil Armstrong913b3642022-04-13 14:59:48 +02004000#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004001 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004002#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
4003#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004004 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
4005 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
4006 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
4007 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004008 }
Gilles Peskine449bd832023-01-11 14:50:10 +01004009 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004010#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004011#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004012 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Neil Armstrongca7d5062022-05-31 14:43:23 +02004013#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01004014 if ((ret = mbedtls_psa_ecjpake_read_round(
4015 &ssl->handshake->psa_pake_ctx, p, end - p,
4016 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
4017 psa_destroy_key(ssl->handshake->psa_pake_password);
4018 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02004019
Gilles Peskine449bd832023-01-11 14:50:10 +01004020 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
4021 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02004022 }
4023#else
Gilles Peskine449bd832023-01-11 14:50:10 +01004024 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
4025 p, end - p);
4026 if (ret != 0) {
4027 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
4028 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004029 }
4030
Gilles Peskine449bd832023-01-11 14:50:10 +01004031 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
4032 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
4033 ssl->conf->f_rng, ssl->conf->p_rng);
4034 if (ret != 0) {
4035 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
4036 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004037 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02004038#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004039 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004040#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004041 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004042 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4043 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004044 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004045
Gilles Peskine449bd832023-01-11 14:50:10 +01004046 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
4047 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
4048 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00004049 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004050
Paul Bakker5121ce52009-01-03 21:22:43 +00004051 ssl->state++;
4052
Gilles Peskine449bd832023-01-11 14:50:10 +01004053 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004054
Gilles Peskine449bd832023-01-11 14:50:10 +01004055 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00004056}
4057
Gilles Peskineeccd8882020-03-10 12:19:08 +01004058#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004059MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004060static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004061{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004062 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004063 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00004064
Gilles Peskine449bd832023-01-11 14:50:10 +01004065 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004066
Gilles Peskine449bd832023-01-11 14:50:10 +01004067 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4068 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02004069 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004070 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02004071 }
4072
Gilles Peskine449bd832023-01-11 14:50:10 +01004073 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4074 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004075}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004076#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004077MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004078static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004079{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004080 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004081 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004082 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004083 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004084 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004085 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004086 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004087 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004088 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01004089 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004090
Gilles Peskine449bd832023-01-11 14:50:10 +01004091 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004092
Gilles Peskine449bd832023-01-11 14:50:10 +01004093 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4094 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004095 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004096 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004097 }
4098
Hanno Becker2a831a42019-02-07 13:17:25 +00004099#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01004100 if (ssl->session_negotiate->peer_cert == NULL) {
4101 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004102 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004103 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004104 }
4105#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004106 if (ssl->session_negotiate->peer_cert_digest == NULL) {
4107 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004108 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004109 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004110 }
4111#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4112
Simon Butcher99000142016-10-13 17:21:01 +01004113 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01004114 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
4115 if (0 != ret) {
4116 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
4117 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004118 }
4119
4120 ssl->state++;
4121
Simon Butcher99000142016-10-13 17:21:01 +01004122 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01004123 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4124 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
4125 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4126 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00004127 }
4128
Gilles Peskine449bd832023-01-11 14:50:10 +01004129 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004130
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004131#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4132 peer_pk = &ssl->handshake->peer_pubkey;
4133#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004134 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004135 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01004136 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004137 }
4138 peer_pk = &ssl->session_negotiate->peer_cert->pk;
4139#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4140
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004141 /*
4142 * struct {
4143 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4144 * opaque signature<0..2^16-1>;
4145 * } DigitallySigned;
4146 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004147 if (i + 2 > ssl->in_hslen) {
4148 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4149 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01004150 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004151
Ronald Cron8457c122022-03-07 11:32:54 +01004152 /*
4153 * Hash
4154 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004155 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01004156
Gilles Peskine449bd832023-01-11 14:50:10 +01004157 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
4158 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4159 " for verify message"));
4160 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004161 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004162
Simon Butcher99000142016-10-13 17:21:01 +01004163#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01004164 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01004165 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01004166 }
Simon Butcher99000142016-10-13 17:21:01 +01004167#endif
Paul Bakker926af752012-11-23 13:38:07 +01004168
Ronald Cron8457c122022-03-07 11:32:54 +01004169 /* Info from md_alg will be used instead */
4170 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004171
Ronald Cron8457c122022-03-07 11:32:54 +01004172 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004173
Ronald Cron8457c122022-03-07 11:32:54 +01004174 /*
4175 * Signature
4176 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004177 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
4178 == MBEDTLS_PK_NONE) {
4179 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4180 " for verify message"));
4181 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004182 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004183
Ronald Cron8457c122022-03-07 11:32:54 +01004184 /*
4185 * Check the certificate's key type matches the signature alg
4186 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004187 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
4188 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
4189 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004190 }
4191
4192 i++;
4193
Gilles Peskine449bd832023-01-11 14:50:10 +01004194 if (i + 2 > ssl->in_hslen) {
4195 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4196 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004197 }
4198
Gilles Peskine449bd832023-01-11 14:50:10 +01004199 sig_len = (ssl->in_msg[i] << 8) | ssl->in_msg[i+1];
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004200 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004201
Gilles Peskine449bd832023-01-11 14:50:10 +01004202 if (i + sig_len != ssl->in_hslen) {
4203 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4204 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00004205 }
4206
Simon Butcher99000142016-10-13 17:21:01 +01004207 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004208 {
4209 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004210 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
4211 if (0 != ret) {
4212 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
4213 return ret;
4214 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004215 }
Simon Butcher99000142016-10-13 17:21:01 +01004216
Gilles Peskine449bd832023-01-11 14:50:10 +01004217 if ((ret = mbedtls_pk_verify(peer_pk,
4218 md_alg, hash_start, hashlen,
4219 ssl->in_msg + i, sig_len)) != 0) {
4220 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
4221 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004222 }
4223
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004224 ret = mbedtls_ssl_update_handshake_status(ssl);
4225 if (0 != ret) {
4226 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
4227 return ret;
4228 }
Simon Butcher99000142016-10-13 17:21:01 +01004229
Gilles Peskine449bd832023-01-11 14:50:10 +01004230 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004231
Gilles Peskine449bd832023-01-11 14:50:10 +01004232 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004233}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004234#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004235
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004236#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004237MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004238static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004239{
Janos Follath865b3eb2019-12-16 11:46:15 +00004240 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004241 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004242 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004243
Gilles Peskine449bd832023-01-11 14:50:10 +01004244 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004245
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004246 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4247 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004248
4249 /*
4250 * struct {
4251 * uint32 ticket_lifetime_hint;
4252 * opaque ticket<0..2^16-1>;
4253 * } NewSessionTicket;
4254 *
4255 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4256 * 8 . 9 ticket_len (n)
4257 * 10 . 9+n ticket content
4258 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004259
Gilles Peskine449bd832023-01-11 14:50:10 +01004260 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4261 ssl->session_negotiate,
4262 ssl->out_msg + 10,
4263 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4264 &tlen, &lifetime)) != 0) {
4265 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004266 tlen = 0;
4267 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004268
Gilles Peskine449bd832023-01-11 14:50:10 +01004269 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4270 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004271 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004272
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004273 /*
4274 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4275 * ChangeCipherSpec share the same state.
4276 */
4277 ssl->handshake->new_session_ticket = 0;
4278
Gilles Peskine449bd832023-01-11 14:50:10 +01004279 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4280 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4281 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004282 }
4283
Gilles Peskine449bd832023-01-11 14:50:10 +01004284 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004285
Gilles Peskine449bd832023-01-11 14:50:10 +01004286 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004287}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004288#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004289
Paul Bakker5121ce52009-01-03 21:22:43 +00004290/*
Paul Bakker1961b702013-01-25 14:49:24 +01004291 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004292 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004293int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004294{
4295 int ret = 0;
4296
Gilles Peskine449bd832023-01-11 14:50:10 +01004297 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004298
Gilles Peskine449bd832023-01-11 14:50:10 +01004299 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004300 case MBEDTLS_SSL_HELLO_REQUEST:
4301 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004302 break;
4303
Paul Bakker1961b702013-01-25 14:49:24 +01004304 /*
4305 * <== ClientHello
4306 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004307 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004308 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004309 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004310
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004311#if defined(MBEDTLS_SSL_PROTO_DTLS)
4312 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004313 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004314#endif
4315
Paul Bakker1961b702013-01-25 14:49:24 +01004316 /*
4317 * ==> ServerHello
4318 * Certificate
4319 * ( ServerKeyExchange )
4320 * ( CertificateRequest )
4321 * ServerHelloDone
4322 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004323 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004324 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004325 break;
4326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004327 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004328 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004329 break;
4330
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004331 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004332 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004333 break;
4334
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004335 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004336 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004337 break;
4338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004339 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004340 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004341 break;
4342
4343 /*
4344 * <== ( Certificate/Alert )
4345 * ClientKeyExchange
4346 * ( CertificateVerify )
4347 * ChangeCipherSpec
4348 * Finished
4349 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004350 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004351 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004352 break;
4353
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004354 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004355 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004356 break;
4357
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004358 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004359 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004360 break;
4361
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004362 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004363 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004364 break;
4365
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004366 case MBEDTLS_SSL_CLIENT_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004367 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004368 break;
4369
4370 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004371 * ==> ( NewSessionTicket )
4372 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004373 * Finished
4374 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004375 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4376#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004377 if (ssl->handshake->new_session_ticket != 0) {
4378 ret = ssl_write_new_session_ticket(ssl);
4379 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004380#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004381 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004382 break;
4383
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004384 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004385 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004386 break;
4387
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004388 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004389 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004390 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004391 break;
4392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004393 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004394 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004395 break;
4396
4397 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004398 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4399 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004400 }
4401
Gilles Peskine449bd832023-01-11 14:50:10 +01004402 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004403}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004404
Gilles Peskine449bd832023-01-11 14:50:10 +01004405void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004406{
TRodziewicz3946f792021-06-14 12:11:18 +02004407 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004408}
4409
Jerry Yufb4b6472022-01-27 15:03:26 +08004410#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */