blob: e052e364c79564381153a702130e3f7742ab7552 [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 Setti1fa5c562023-03-20 13:56:38 +0100151#if defined(MBEDTLS_PK_CAN_ECDH) || defined(MBEDTLS_PK_CAN_ECDSA_SOME) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100152 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub925f212022-01-12 11:17:02 +0800153/*
Jerry Yud491ea42022-01-13 16:15:25 +0800154 * Function for parsing a supported groups (TLS 1.3) or supported elliptic
155 * curves (TLS 1.2) extension.
156 *
157 * The "extension_data" field of a supported groups extension contains a
158 * "NamedGroupList" value (TLS 1.3 RFC8446):
159 * enum {
160 * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
161 * x25519(0x001D), x448(0x001E),
162 * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
163 * ffdhe6144(0x0103), ffdhe8192(0x0104),
164 * ffdhe_private_use(0x01FC..0x01FF),
165 * ecdhe_private_use(0xFE00..0xFEFF),
166 * (0xFFFF)
167 * } NamedGroup;
168 * struct {
169 * NamedGroup named_group_list<2..2^16-1>;
170 * } NamedGroupList;
171 *
172 * The "extension_data" field of a supported elliptic curves extension contains
173 * a "NamedCurveList" value (TLS 1.2 RFC 8422):
174 * enum {
175 * deprecated(1..22),
176 * secp256r1 (23), secp384r1 (24), secp521r1 (25),
177 * x25519(29), x448(30),
178 * reserved (0xFE00..0xFEFF),
179 * deprecated(0xFF01..0xFF02),
180 * (0xFFFF)
181 * } NamedCurve;
182 * struct {
183 * NamedCurve named_curve_list<2..2^16-1>
184 * } NamedCurveList;
185 *
Jerry Yub925f212022-01-12 11:17:02 +0800186 * The TLS 1.3 supported groups extension was defined to be a compatible
187 * generalization of the TLS 1.2 supported elliptic curves extension. They both
188 * share the same extension identifier.
Jerry Yud491ea42022-01-13 16:15:25 +0800189 *
Jerry Yub925f212022-01-12 11:17:02 +0800190 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200191MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100192static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
193 const unsigned char *buf,
194 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100195{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200196 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100197 const unsigned char *p;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100198 uint16_t *curves_tls_id;
Paul Bakker41c83d32013-03-20 14:39:14 +0100199
Gilles Peskine449bd832023-01-11 14:50:10 +0100200 if (len < 2) {
201 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
202 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
203 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
204 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +0200205 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100206 list_size = ((buf[0] << 8) | (buf[1]));
207 if (list_size + 2 != len ||
208 list_size % 2 != 0) {
209 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
210 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
211 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
212 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100213 }
214
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200215 /* Should never happen unless client duplicates the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100216 if (ssl->handshake->curves_tls_id != NULL) {
217 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
218 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
219 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
220 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200221 }
222
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100223 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200224 * and leave room for a final 0 */
225 our_size = list_size / 2 + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100226 if (our_size > MBEDTLS_ECP_DP_MAX) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200227 our_size = MBEDTLS_ECP_DP_MAX;
Gilles Peskine449bd832023-01-11 14:50:10 +0100228 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200229
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 if ((curves_tls_id = mbedtls_calloc(our_size,
231 sizeof(*curves_tls_id))) == NULL) {
232 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
233 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
234 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200235 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200236
Valerio Setti18c9fed2022-12-30 17:44:24 +0100237 ssl->handshake->curves_tls_id = curves_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200238
Paul Bakker41c83d32013-03-20 14:39:14 +0100239 p = buf + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 while (list_size > 0 && our_size > 1) {
241 uint16_t curr_tls_id = MBEDTLS_GET_UINT16_BE(p, 0);
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200242
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 if (mbedtls_ssl_get_ecp_group_id_from_tls_id(curr_tls_id) !=
244 MBEDTLS_ECP_DP_NONE) {
Valerio Setti18c9fed2022-12-30 17:44:24 +0100245 *curves_tls_id++ = curr_tls_id;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200246 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100247 }
248
249 list_size -= 2;
250 p += 2;
251 }
252
Gilles Peskine449bd832023-01-11 14:50:10 +0100253 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100254}
255
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200256MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100257static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl,
258 const unsigned char *buf,
259 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100260{
261 size_t list_size;
262 const unsigned char *p;
263
Gilles Peskine449bd832023-01-11 14:50:10 +0100264 if (len == 0 || (size_t) (buf[0] + 1) != len) {
265 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
266 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
267 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
268 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100269 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200270 list_size = buf[0];
Paul Bakker41c83d32013-03-20 14:39:14 +0100271
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200272 p = buf + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100273 while (list_size > 0) {
274 if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
275 p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
Valerio Setti7aeec542023-07-05 18:57:21 +0200276#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
277 defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200278 ssl->handshake->ecdh_ctx.point_format = p[0];
Valerio Setti7aeec542023-07-05 18:57:21 +0200279#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED */
Neil Armstrongca7d5062022-05-31 14:43:23 +0200280#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100281 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
282 mbedtls_ecjpake_set_point_format(&ssl->handshake->ecjpake_ctx,
283 p[0]);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200284#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +0100285 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
286 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100287 }
288
289 list_size--;
290 p++;
291 }
292
Gilles Peskine449bd832023-01-11 14:50:10 +0100293 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100294}
Valerio Setti1fa5c562023-03-20 13:56:38 +0100295#endif /* MBEDTLS_PK_CAN_ECDH || MBEDTLS_PK_CAN_ECDSA_SOME ||
Robert Cragieae8535d2015-10-06 17:11:18 +0100296 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100297
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200298#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200299MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100300static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
301 const unsigned char *buf,
302 size_t len)
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200303{
Janos Follath865b3eb2019-12-16 11:46:15 +0000304 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200305
Neil Armstrongca7d5062022-05-31 14:43:23 +0200306#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100307 if (ssl->handshake->psa_pake_ctx_is_ok != 1)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200308#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100309 if (mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0)
Neil Armstrongca7d5062022-05-31 14:43:23 +0200310#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200311 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100312 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
313 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200314 }
315
Neil Armstrongca7d5062022-05-31 14:43:23 +0200316#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100317 if ((ret = mbedtls_psa_ecjpake_read_round(
318 &ssl->handshake->psa_pake_ctx, buf, len,
319 MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
320 psa_destroy_key(ssl->handshake->psa_pake_password);
321 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200322
Gilles Peskine449bd832023-01-11 14:50:10 +0100323 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
Valerio Setti02c25b52022-11-15 14:08:42 +0100324 mbedtls_ssl_send_alert_message(
Gilles Peskine449bd832023-01-11 14:50:10 +0100325 ssl,
326 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
327 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200328
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200330 }
331#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100332 if ((ret = mbedtls_ecjpake_read_round_one(&ssl->handshake->ecjpake_ctx,
333 buf, len)) != 0) {
334 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_one", ret);
335 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
336 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
337 return ret;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200338 }
Neil Armstrongca7d5062022-05-31 14:43:23 +0200339#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200340
341 /* Only mark the extension as OK when we're sure it is */
342 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
343
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200345}
346#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
347
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200348#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200349MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100350static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
351 const unsigned char *buf,
352 size_t len)
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200353{
Gilles Peskine449bd832023-01-11 14:50:10 +0100354 if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
355 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
356 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
357 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
358 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200359 }
360
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200361 ssl->session_negotiate->mfl_code = buf[0];
362
Gilles Peskine449bd832023-01-11 14:50:10 +0100363 return 0;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200364}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200365#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200366
Hanno Beckera0e20d02019-05-15 14:03:01 +0100367#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200368MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100369static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
370 const unsigned char *buf,
371 size_t len)
Hanno Becker89dcc882019-04-26 13:56:39 +0100372{
373 size_t peer_cid_len;
374
375 /* CID extension only makes sense in DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100376 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
377 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
378 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
379 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
380 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100381 }
382
383 /*
Hanno Becker89dcc882019-04-26 13:56:39 +0100384 * struct {
385 * opaque cid<0..2^8-1>;
386 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +0100387 */
Hanno Becker89dcc882019-04-26 13:56:39 +0100388
Gilles Peskine449bd832023-01-11 14:50:10 +0100389 if (len < 1) {
390 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
391 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
392 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
393 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100394 }
395
396 peer_cid_len = *buf++;
397 len--;
398
Gilles Peskine449bd832023-01-11 14:50:10 +0100399 if (len != peer_cid_len) {
400 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
401 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
402 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
403 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100404 }
405
406 /* Ignore CID if the user has disabled its use. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100407 if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker89dcc882019-04-26 13:56:39 +0100408 /* Leave ssl->handshake->cid_in_use in its default
409 * value of MBEDTLS_SSL_CID_DISABLED. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100410 MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled"));
411 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100412 }
413
Gilles Peskine449bd832023-01-11 14:50:10 +0100414 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
415 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
416 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
417 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
418 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100419 }
420
Hanno Becker08556bf2019-05-03 12:43:44 +0100421 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker89dcc882019-04-26 13:56:39 +0100422 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100423 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100424
Gilles Peskine449bd832023-01-11 14:50:10 +0100425 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
426 MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100427
Gilles Peskine449bd832023-01-11 14:50:10 +0100428 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100429}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100430#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100431
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200432#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200433MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100434static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
435 const unsigned char *buf,
436 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100437{
Gilles Peskine449bd832023-01-11 14:50:10 +0100438 if (len != 0) {
439 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
440 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
441 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
442 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100443 }
444
445 ((void) buf);
446
Gilles Peskine449bd832023-01-11 14:50:10 +0100447 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200448 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100449 }
450
Gilles Peskine449bd832023-01-11 14:50:10 +0100451 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100452}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200453#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100454
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200455#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200456MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100457static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
458 const unsigned char *buf,
459 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200460{
Gilles Peskine449bd832023-01-11 14:50:10 +0100461 if (len != 0) {
462 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
463 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
464 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
465 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200466 }
467
468 ((void) buf);
469
Gilles Peskine449bd832023-01-11 14:50:10 +0100470 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200471 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200472 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200473
Gilles Peskine449bd832023-01-11 14:50:10 +0100474 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200475}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200476#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200477
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200478#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200479MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100480static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
481 unsigned char *buf,
482 size_t len)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200483{
Janos Follath865b3eb2019-12-16 11:46:15 +0000484 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200485 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200486
Gilles Peskine449bd832023-01-11 14:50:10 +0100487 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200488
Gilles Peskine449bd832023-01-11 14:50:10 +0100489 if (ssl->conf->f_ticket_parse == NULL ||
490 ssl->conf->f_ticket_write == NULL) {
491 return 0;
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200492 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200493
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200494 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200495 ssl->handshake->new_session_ticket = 1;
496
Gilles Peskine449bd832023-01-11 14:50:10 +0100497 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200498
Gilles Peskine449bd832023-01-11 14:50:10 +0100499 if (len == 0) {
500 return 0;
501 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200502
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200503#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100504 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
505 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
506 return 0;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200507 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200508#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200509
510 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200511 * Failures are ok: just ignore the ticket and proceed.
512 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100513 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session,
514 buf, len)) != 0) {
515 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200516
Gilles Peskine449bd832023-01-11 14:50:10 +0100517 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
518 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
519 } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
520 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
521 } else {
522 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
523 }
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200524
Gilles Peskine449bd832023-01-11 14:50:10 +0100525 return 0;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200526 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200527
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200528 /*
529 * Keep the session ID sent by the client, since we MUST send it back to
530 * inform them we're accepting the ticket (RFC 5077 section 3.4)
531 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200532 session.id_len = ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100533 memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200534
Gilles Peskine449bd832023-01-11 14:50:10 +0100535 mbedtls_ssl_session_free(ssl->session_negotiate);
536 memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200537
538 /* Zeroize instead of free as we copied the content */
Gilles Peskine449bd832023-01-11 14:50:10 +0100539 mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200540
Gilles Peskine449bd832023-01-11 14:50:10 +0100541 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200542
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200543 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200544
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200545 /* Don't send a new ticket after all, this one is OK */
546 ssl->handshake->new_session_ticket = 0;
547
Gilles Peskine449bd832023-01-11 14:50:10 +0100548 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200549}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200550#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200551
Johan Pascalb62bb512015-12-03 21:56:45 +0100552#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200553MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100554static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
555 const unsigned char *buf,
556 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100557{
Johan Pascal43f94902020-09-22 12:25:52 +0200558 mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
Gilles Peskine449bd832023-01-11 14:50:10 +0100559 size_t i, j;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200560 size_t profile_length;
561 uint16_t mki_length;
Ron Eldor313d7b52018-12-10 14:56:21 +0200562 /*! 2 bytes for profile length and 1 byte for mki len */
563 const size_t size_of_lengths = 3;
Johan Pascalb62bb512015-12-03 21:56:45 +0100564
565 /* If use_srtp is not configured, just ignore the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100566 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
567 (ssl->conf->dtls_srtp_profile_list == NULL) ||
568 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
569 return 0;
Johan Pascal85269572020-08-25 10:01:54 +0200570 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100571
572 /* RFC5764 section 4.1.1
573 * uint8 SRTPProtectionProfile[2];
574 *
575 * struct {
576 * SRTPProtectionProfiles SRTPProtectionProfiles;
577 * opaque srtp_mki<0..255>;
578 * } UseSRTPData;
579
580 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100581 */
582
Ron Eldoref72faf2018-07-12 11:54:20 +0300583 /*
584 * Min length is 5: at least one protection profile(2 bytes)
585 * and length(2 bytes) + srtp_mki length(1 byte)
Johan Pascal042d4562020-08-25 12:14:02 +0200586 * Check here that we have at least 2 bytes of protection profiles length
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200587 * and one of srtp_mki length
Ron Eldoref72faf2018-07-12 11:54:20 +0300588 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100589 if (len < size_of_lengths) {
590 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
591 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
592 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200593 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100594
Gilles Peskine449bd832023-01-11 14:50:10 +0100595 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200596
Ron Eldoref72faf2018-07-12 11:54:20 +0300597 /* first 2 bytes are protection profile length(in bytes) */
Gilles Peskine449bd832023-01-11 14:50:10 +0100598 profile_length = (buf[0] << 8) | buf[1];
Johan Pascal042d4562020-08-25 12:14:02 +0200599 buf += 2;
Ron Eldor591f1622018-01-22 12:30:04 +0200600
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200601 /* The profile length cannot be bigger than input buffer size - lengths fields */
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 if (profile_length > len - size_of_lengths ||
603 profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */
604 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
605 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
606 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200607 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300608 /*
609 * parse the extension list values are defined in
610 * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
611 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100612 for (j = 0; j < profile_length; j += 2) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200613 uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
Gilles Peskine449bd832023-01-11 14:50:10 +0100614 client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
Johan Pascalb62bb512015-12-03 21:56:45 +0100615
Gilles Peskine449bd832023-01-11 14:50:10 +0100616 if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
617 MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
618 mbedtls_ssl_get_srtp_profile_as_string(
619 client_protection)));
620 } else {
Johan Pascal85269572020-08-25 10:01:54 +0200621 continue;
622 }
Ron Eldor591f1622018-01-22 12:30:04 +0200623 /* check if suggested profile is in our list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100624 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
625 if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
Ron Eldor3adb9922017-12-21 10:15:08 +0200626 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Gilles Peskine449bd832023-01-11 14:50:10 +0100627 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
628 mbedtls_ssl_get_srtp_profile_as_string(
629 client_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +0200630 break;
Johan Pascalb62bb512015-12-03 21:56:45 +0100631 }
632 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100633 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) {
Ron Eldor591f1622018-01-22 12:30:04 +0200634 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100635 }
Ron Eldor591f1622018-01-22 12:30:04 +0200636 }
Johan Pascal042d4562020-08-25 12:14:02 +0200637 buf += profile_length; /* buf points to the mki length */
638 mki_length = *buf;
639 buf++;
Ron Eldor591f1622018-01-22 12:30:04 +0200640
Gilles Peskine449bd832023-01-11 14:50:10 +0100641 if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
642 mki_length + profile_length + size_of_lengths != len) {
643 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
644 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
645 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Johan Pascal042d4562020-08-25 12:14:02 +0200646 }
647
648 /* Parse the mki only if present and mki is supported locally */
Gilles Peskine449bd832023-01-11 14:50:10 +0100649 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
650 mki_length > 0) {
Johan Pascal042d4562020-08-25 12:14:02 +0200651 ssl->dtls_srtp_info.mki_len = mki_length;
652
Gilles Peskine449bd832023-01-11 14:50:10 +0100653 memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
Ron Eldorb4655392018-07-05 18:25:39 +0300654
Gilles Peskine449bd832023-01-11 14:50:10 +0100655 MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value,
656 ssl->dtls_srtp_info.mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100657 }
658
Gilles Peskine449bd832023-01-11 14:50:10 +0100659 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100660}
661#endif /* MBEDTLS_SSL_DTLS_SRTP */
662
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100663/*
664 * Auxiliary functions for ServerHello parsing and related actions
665 */
666
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200667#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100668/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100669 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100670 */
Valerio Setti1fa5c562023-03-20 13:56:38 +0100671#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200672MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100673static int ssl_check_key_curve(mbedtls_pk_context *pk,
674 uint16_t *curves_tls_id)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100675{
Valerio Setti18c9fed2022-12-30 17:44:24 +0100676 uint16_t *curr_tls_id = curves_tls_id;
Valerio Setti77a75682023-05-15 11:18:46 +0200677 mbedtls_ecp_group_id grp_id = mbedtls_pk_ec_ro(*pk)->grp.id;
Valerio Setti18c9fed2022-12-30 17:44:24 +0100678 mbedtls_ecp_group_id curr_grp_id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100679
Gilles Peskine449bd832023-01-11 14:50:10 +0100680 while (*curr_tls_id != 0) {
681 curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
682 if (curr_grp_id == grp_id) {
683 return 0;
684 }
Valerio Setti18c9fed2022-12-30 17:44:24 +0100685 curr_tls_id++;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100686 }
687
Gilles Peskine449bd832023-01-11 14:50:10 +0100688 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100689}
Valerio Setti1fa5c562023-03-20 13:56:38 +0100690#endif /* MBEDTLS_PK_CAN_ECDSA_SOME */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100691
692/*
693 * Try picking a certificate for this ciphersuite,
694 * return 0 on success and -1 on failure.
695 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200696MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100697static int ssl_pick_cert(mbedtls_ssl_context *ssl,
698 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100699{
Glenn Strauss041a3762022-03-15 06:08:29 -0400700 mbedtls_ssl_key_cert *cur, *list;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200701#if defined(MBEDTLS_USE_PSA_CRYPTO)
702 psa_algorithm_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100703 mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200704 psa_key_usage_t pk_usage =
Gilles Peskine449bd832023-01-11 14:50:10 +0100705 mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200706#else
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100707 mbedtls_pk_type_t pk_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +0100708 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200709#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200710 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100711
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200712#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100713 if (ssl->handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100714 list = ssl->handshake->sni_key_cert;
Gilles Peskine449bd832023-01-11 14:50:10 +0100715 } else
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100716#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100717 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100718
David Horstmann3a334c22022-10-25 10:53:44 +0100719 int pk_alg_is_none = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200720#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100721 pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200722#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100723 pk_alg_is_none = (pk_alg == MBEDTLS_PK_NONE);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200724#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 if (pk_alg_is_none) {
726 return 0;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200727 }
728
Gilles Peskine449bd832023-01-11 14:50:10 +0100729 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
730
731 if (list == NULL) {
732 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
733 return -1;
734 }
735
736 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400737 flags = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100738 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
739 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000740
David Horstmann3a334c22022-10-25 10:53:44 +0100741 int key_type_matches = 0;
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200742#if defined(MBEDTLS_USE_PSA_CRYPTO)
743#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100744 key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
745 ssl->conf->f_async_decrypt_start != NULL ||
746 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
747 mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200748#else
David Horstmann3a334c22022-10-25 10:53:44 +0100749 key_type_matches = (
Gilles Peskine449bd832023-01-11 14:50:10 +0100750 mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200751#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
752#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100753 key_type_matches = mbedtls_pk_can_do(&cur->cert->pk, pk_alg);
Neil Armstrong0c9c10a2022-05-12 14:15:06 +0200754#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100755 if (!key_type_matches) {
756 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100757 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000758 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100759
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200760 /*
761 * This avoids sending the client a cert it'll reject based on
762 * keyUsage or other extensions.
763 *
764 * It also allows the user to provision different certificates for
765 * different uses based on keyUsage, eg if they want to avoid signing
766 * and decrypting with the same RSA key.
767 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100768 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
769 MBEDTLS_SSL_IS_SERVER, &flags) != 0) {
770 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
771 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200772 continue;
773 }
774
Valerio Setti1fa5c562023-03-20 13:56:38 +0100775#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
Gilles Peskine449bd832023-01-11 14:50:10 +0100776 if (pk_alg == MBEDTLS_PK_ECDSA &&
777 ssl_check_key_curve(&cur->cert->pk,
778 ssl->handshake->curves_tls_id) != 0) {
779 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100780 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000781 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100782#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100783
784 /* If we get there, we got a winner */
785 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100786 }
787
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200788 /* Do not update ssl->handshake->key_cert unless there is a match */
Gilles Peskine449bd832023-01-11 14:50:10 +0100789 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100790 ssl->handshake->key_cert = cur;
Gilles Peskine449bd832023-01-11 14:50:10 +0100791 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
792 ssl->handshake->key_cert->cert);
793 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100794 }
795
Gilles Peskine449bd832023-01-11 14:50:10 +0100796 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100797}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200798#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100799
800/*
801 * Check if a given ciphersuite is suitable for use with our config/keys/etc
802 * Sets ciphersuite_info only if the suite matches.
803 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200804MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100805static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
806 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100807{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200808 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100809
Jerry Yue7541932022-01-28 10:21:24 +0800810#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100811 mbedtls_pk_type_t sig_type;
812#endif
813
Gilles Peskine449bd832023-01-11 14:50:10 +0100814 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
815 if (suite_info == NULL) {
816 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
817 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100818 }
819
Gilles Peskine449bd832023-01-11 14:50:10 +0100820 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
821 (unsigned int) suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000822
Gilles Peskine449bd832023-01-11 14:50:10 +0100823 if (suite_info->min_tls_version > ssl->tls_version ||
824 suite_info->max_tls_version < ssl->tls_version) {
825 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
826 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000827 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100828
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200829#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100830 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
831 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
832 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
833 "not configured or ext missing"));
834 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200835 }
836#endif
837
838
Valerio Setti1fa5c562023-03-20 13:56:38 +0100839#if defined(MBEDTLS_PK_CAN_ECDH) || defined(MBEDTLS_PK_CAN_ECDSA_SOME)
Gilles Peskine449bd832023-01-11 14:50:10 +0100840 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
841 (ssl->handshake->curves_tls_id == NULL ||
842 ssl->handshake->curves_tls_id[0] == 0)) {
843 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
844 "no common elliptic curve"));
845 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000846 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100847#endif
848
Gilles Peskineeccd8882020-03-10 12:19:08 +0100849#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100850 /* If the ciphersuite requires a pre-shared key and we don't
851 * have one, skip it now rather than failing later */
Gilles Peskine449bd832023-01-11 14:50:10 +0100852 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
853 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
854 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
855 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000856 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100857#endif
858
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200859#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100860 /*
861 * Final check: if ciphersuite requires us to have a
862 * certificate/key of a particular type:
863 * - select the appropriate certificate if we have one, or
864 * - try the next ciphersuite if we don't
865 * This must be done last since we modify the key_cert list.
866 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100867 if (ssl_pick_cert(ssl, suite_info) != 0) {
868 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
869 "no suitable certificate"));
870 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000871 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100872#endif
873
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200874#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
875 /* If the ciphersuite requires signing, check whether
876 * a suitable hash algorithm is present. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100877 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
878 if (sig_type != MBEDTLS_PK_NONE &&
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200879 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +0100880 ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
881 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
882 "for signature algorithm %u", (unsigned) sig_type));
883 return 0;
Neil Armstrong9f1176a2022-06-24 18:19:19 +0200884 }
885
886#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
887
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100888 *ciphersuite_info = suite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +0100889 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100890}
891
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200892/* This function doesn't alert on errors that happen early during
893 ClientHello parsing because they might indicate that the client is
894 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200895MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100896static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000897{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100898 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200899 size_t i, j;
900 size_t ciph_offset, comp_offset, ext_offset;
901 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200902#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +0200903 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100904#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000905 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200906#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000907 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100908#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000909 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200910 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200911 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000912
Hanno Becker7e5437a2017-04-28 17:15:26 +0100913 /* If there is no signature-algorithm extension present,
914 * we need to fall back to the default values for allowed
915 * signature-hash pairs. */
Jerry Yue7541932022-01-28 10:21:24 +0800916#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100917 int sig_hash_alg_ext_present = 0;
Jerry Yue7541932022-01-28 10:21:24 +0800918#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100919
Gilles Peskine449bd832023-01-11 14:50:10 +0100920 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +0000921
David Horstmanne0af39a2022-10-06 18:19:18 +0100922 int renegotiating;
923
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200924#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200925read_record_header:
926#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100927 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200928 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100929 * otherwise read it ourselves manually in order to support SSLv2
930 * ClientHello, which doesn't use the same record layer format.
Ronald Cron6291b232023-03-08 15:51:25 +0100931 * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
932 * ClientHello has been already fully fetched by the TLS 1.3 code and the
933 * flag ssl->keep_current_message is raised.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100934 */
David Horstmanne0af39a2022-10-06 18:19:18 +0100935 renegotiating = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200936#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100937 renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100938#endif
Ronald Cron6291b232023-03-08 15:51:25 +0100939 if (!renegotiating && !ssl->keep_current_message) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100940 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200941 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100942 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
943 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000944 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000945 }
946
947 buf = ssl->in_hdr;
948
Gilles Peskine449bd832023-01-11 14:50:10 +0100949 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +0000950
Paul Bakkerec636f32012-09-09 19:17:02 +0000951 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100952 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +0000953 *
954 * Record layer:
955 * 0 . 0 message type
956 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200957 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +0000958 * 3 . 4 message length
959 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100960 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
961 buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100962
Gilles Peskine449bd832023-01-11 14:50:10 +0100963 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
964 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
965 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100966 }
967
Gilles Peskine449bd832023-01-11 14:50:10 +0100968 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
969 (ssl->in_len[0] << 8) | ssl->in_len[1]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100970
Gilles Peskine449bd832023-01-11 14:50:10 +0100971 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
972 buf[1], buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +0100973
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200974 /* For DTLS if this is the initial handshake, remember the client sequence
975 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200976#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100977 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200978#if defined(MBEDTLS_SSL_RENEGOTIATION)
979 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +0000980#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100981 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200982 /* Epoch should be 0 for initial handshakes */
Gilles Peskine449bd832023-01-11 14:50:10 +0100983 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
984 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
985 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +0200986 }
987
Gilles Peskine449bd832023-01-11 14:50:10 +0100988 memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
989 sizeof(ssl->cur_out_ctr) - 2);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200990
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200991#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Gilles Peskine449bd832023-01-11 14:50:10 +0100992 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
993 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +0200994 ssl->next_record_offset = 0;
995 ssl->in_left = 0;
996 goto read_record_header;
997 }
998
999 /* No MAC to check yet, so we can update right now */
Gilles Peskine449bd832023-01-11 14:50:10 +01001000 mbedtls_ssl_dtls_replay_update(ssl);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001001#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001002 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001003#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001004
Gilles Peskine449bd832023-01-11 14:50:10 +01001005 msg_len = (ssl->in_len[0] << 8) | ssl->in_len[1];
Paul Bakker5121ce52009-01-03 21:22:43 +00001006
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001007#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001008 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001009 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001010 msg_len = ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +01001011 } else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001012#endif
Paul Bakkerec636f32012-09-09 19:17:02 +00001013 {
Ronald Cron6291b232023-03-08 15:51:25 +01001014 if (ssl->keep_current_message) {
1015 ssl->keep_current_message = 0;
1016 } else {
1017 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
1018 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1019 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1020 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001021
Ronald Cron6291b232023-03-08 15:51:25 +01001022 if ((ret = mbedtls_ssl_fetch_input(ssl,
1023 mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
1024 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
1025 return ret;
1026 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001027
Ronald Cron6291b232023-03-08 15:51:25 +01001028 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001029#if defined(MBEDTLS_SSL_PROTO_DTLS)
Ronald Cron6291b232023-03-08 15:51:25 +01001030 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1031 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
1032 } else
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001033#endif
Ronald Cron6291b232023-03-08 15:51:25 +01001034 ssl->in_left = 0;
1035 }
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001036 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001037
1038 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +00001039
Gilles Peskine449bd832023-01-11 14:50:10 +01001040 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001041
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001042 ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
1043 if (0 != ret) {
1044 MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1045 return ret;
1046 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001047
1048 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001049 * Handshake layer:
1050 * 0 . 0 handshake type
1051 * 1 . 3 handshake length
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001052 * 4 . 5 DTLS only: message sequence number
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001053 * 6 . 8 DTLS only: fragment offset
1054 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001055 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001056 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1057 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1058 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001059 }
1060
Gilles Peskine449bd832023-01-11 14:50:10 +01001061 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001062
Gilles Peskine449bd832023-01-11 14:50:10 +01001063 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1064 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1065 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001066 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001067 {
Gilles Peskine449bd832023-01-11 14:50:10 +01001068 size_t handshake_len = MBEDTLS_GET_UINT24_BE(buf, 1);
1069 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %u",
1070 (unsigned) handshake_len));
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001071
1072 /* The record layer has a record size limit of 2^14 - 1 and
1073 * fragmentation is not supported, so buf[1] should be zero. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001074 if (buf[1] != 0) {
1075 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != 0",
1076 (unsigned) buf[1]));
1077 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001078 }
1079
1080 /* We don't support fragmentation of ClientHello (yet?) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001081 if (msg_len != mbedtls_ssl_hs_hdr_len(ssl) + handshake_len) {
1082 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != %u + %u",
1083 (unsigned) msg_len,
1084 (unsigned) mbedtls_ssl_hs_hdr_len(ssl),
1085 (unsigned) handshake_len));
1086 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001087 }
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001088 }
1089
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001090#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001091 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001092 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001093 * Copy the client's handshake message_seq on initial handshakes,
1094 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001095 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001096#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001097 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001098 /* This couldn't be done in ssl_prepare_handshake_record() */
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001099 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Gilles Peskine449bd832023-01-11 14:50:10 +01001100 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1101 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1102 "%u (expected %u)", cli_msg_seq,
1103 ssl->handshake->in_msg_seq));
1104 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001105 }
1106
1107 ssl->handshake->in_msg_seq++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001108 } else
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001109#endif
1110 {
Thomas Daubneyf9f0ba82023-05-23 17:34:33 +01001111 unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001112 ssl->handshake->out_msg_seq = cli_msg_seq;
1113 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1114 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001115 {
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001116 /*
1117 * For now we don't support fragmentation, so make sure
1118 * fragment_offset == 0 and fragment_length == length
1119 */
1120 size_t fragment_offset, fragment_length, length;
Gilles Peskine449bd832023-01-11 14:50:10 +01001121 fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1122 fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1123 length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001124 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskine449bd832023-01-11 14:50:10 +01001125 4, ("fragment_offset=%u fragment_length=%u length=%u",
1126 (unsigned) fragment_offset, (unsigned) fragment_length,
1127 (unsigned) length));
1128 if (fragment_offset != 0 || length != fragment_length) {
1129 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1130 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Andrzej Kurekcbe14ec2022-06-15 07:17:28 -04001131 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001132 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001133 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001134#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001135
Gilles Peskine449bd832023-01-11 14:50:10 +01001136 buf += mbedtls_ssl_hs_hdr_len(ssl);
1137 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001138
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001139 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001140 * ClientHello layer:
1141 * 0 . 1 protocol version
1142 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
1143 * 34 . 35 session id length (1 byte)
1144 * 35 . 34+x session id
1145 * 35+x . 35+x DTLS only: cookie length (1 byte)
1146 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001147 * .. . .. ciphersuite list length (2 bytes)
1148 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001149 * .. . .. compression alg. list length (1 byte)
1150 * .. . .. compression alg. list
1151 * .. . .. extensions length (2 bytes, optional)
1152 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001153 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001154
1155 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001156 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001157 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1158 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001159 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001160 if (msg_len < 38) {
1161 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1162 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001163 }
1164
1165 /*
1166 * Check and save the protocol version
1167 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001168 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001169
Gilles Peskine449bd832023-01-11 14:50:10 +01001170 ssl->tls_version = mbedtls_ssl_read_version(buf, ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001171 ssl->session_negotiate->tls_version = ssl->tls_version;
Paul Bakkerec636f32012-09-09 19:17:02 +00001172
Gilles Peskine449bd832023-01-11 14:50:10 +01001173 if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1174 MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1175 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1176 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1177 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001178 }
1179
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001180 /*
1181 * Save client random (inc. Unix time)
1182 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001183 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001184
Gilles Peskine449bd832023-01-11 14:50:10 +01001185 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001186
1187 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001188 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001189 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001190 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001191
Gilles Peskine449bd832023-01-11 14:50:10 +01001192 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1193 sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1194 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1195 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1196 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1197 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001198 }
1199
Gilles Peskine449bd832023-01-11 14:50:10 +01001200 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001201
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001202 ssl->session_negotiate->id_len = sess_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001203 memset(ssl->session_negotiate->id, 0,
1204 sizeof(ssl->session_negotiate->id));
1205 memcpy(ssl->session_negotiate->id, buf + 35,
1206 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001207
1208 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001209 * Check the cookie length and content
1210 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001211#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001212 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001213 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001214 cookie_len = buf[cookie_offset];
1215
Gilles Peskine449bd832023-01-11 14:50:10 +01001216 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1217 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1218 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1219 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1220 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001221 }
1222
Gilles Peskine449bd832023-01-11 14:50:10 +01001223 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1224 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001225
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001226#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01001227 if (ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001228#if defined(MBEDTLS_SSL_RENEGOTIATION)
1229 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001230#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001231 ) {
1232 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1233 buf + cookie_offset + 1, cookie_len,
1234 ssl->cli_id, ssl->cli_id_len) != 0) {
1235 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001236 ssl->handshake->cookie_verify_result = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001237 } else {
1238 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001239 ssl->handshake->cookie_verify_result = 0;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001240 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001241 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001242#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001243 {
1244 /* We know we didn't send a cookie, so it should be empty */
Gilles Peskine449bd832023-01-11 14:50:10 +01001245 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001246 /* This may be an attacker's probe, so don't send an alert */
Gilles Peskine449bd832023-01-11 14:50:10 +01001247 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1248 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001249 }
1250
Gilles Peskine449bd832023-01-11 14:50:10 +01001251 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001252 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001253
Gilles Peskine449bd832023-01-11 14:50:10 +01001254 /*
1255 * Check the ciphersuitelist length (will be parsed later)
1256 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001257 ciph_offset = cookie_offset + 1 + cookie_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001258 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001259#endif /* MBEDTLS_SSL_PROTO_DTLS */
Gilles Peskine449bd832023-01-11 14:50:10 +01001260 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001261
Gilles Peskine449bd832023-01-11 14:50:10 +01001262 ciph_len = (buf[ciph_offset + 0] << 8)
1263 | (buf[ciph_offset + 1]);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001264
Gilles Peskine449bd832023-01-11 14:50:10 +01001265 if (ciph_len < 2 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001266 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
Gilles Peskine449bd832023-01-11 14:50:10 +01001267 (ciph_len % 2) != 0) {
1268 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1269 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1270 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1271 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001272 }
1273
Gilles Peskine449bd832023-01-11 14:50:10 +01001274 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1275 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001276
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001277 /*
Thomas Daubney20f89a92022-06-20 15:12:19 +01001278 * Check the compression algorithm's length.
1279 * The list contents are ignored because implementing
1280 * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1281 * option supported by Mbed TLS.
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001282 */
1283 comp_offset = ciph_offset + 2 + ciph_len;
1284
1285 comp_len = buf[comp_offset];
1286
Gilles Peskine449bd832023-01-11 14:50:10 +01001287 if (comp_len < 1 ||
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001288 comp_len > 16 ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001289 comp_len + comp_offset + 1 > msg_len) {
1290 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1291 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1292 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1293 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001294 }
1295
Gilles Peskine449bd832023-01-11 14:50:10 +01001296 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1297 buf + comp_offset + 1, comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001298
Gilles Peskine449bd832023-01-11 14:50:10 +01001299 /*
1300 * Check the extension length
1301 */
1302 ext_offset = comp_offset + 1 + comp_len;
1303 if (msg_len > ext_offset) {
1304 if (msg_len < ext_offset + 2) {
1305 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1306 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1307 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1308 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001309 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001310
Gilles Peskine449bd832023-01-11 14:50:10 +01001311 ext_len = (buf[ext_offset + 0] << 8)
1312 | (buf[ext_offset + 1]);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001313
Gilles Peskine449bd832023-01-11 14:50:10 +01001314 if (msg_len != ext_offset + 2 + ext_len) {
1315 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1316 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1317 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1318 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1319 }
1320 } else {
1321 ext_len = 0;
1322 }
Paul Bakker48916f92012-09-16 19:57:18 +00001323
Gilles Peskine449bd832023-01-11 14:50:10 +01001324 ext = buf + ext_offset + 2;
1325 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1326
1327 while (ext_len != 0) {
1328 unsigned int ext_id;
1329 unsigned int ext_size;
1330 if (ext_len < 4) {
1331 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1332 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1333 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1334 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1335 }
1336 ext_id = ((ext[0] << 8) | (ext[1]));
1337 ext_size = ((ext[2] << 8) | (ext[3]));
1338
1339 if (ext_size + 4 > ext_len) {
1340 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1341 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1342 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1343 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1344 }
1345 switch (ext_id) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001346#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001347 case MBEDTLS_TLS_EXT_SERVERNAME:
Gilles Peskine449bd832023-01-11 14:50:10 +01001348 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1349 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1350 ext + 4 + ext_size);
1351 if (ret != 0) {
1352 return ret;
1353 }
Simon Butcher584a5472016-05-23 16:24:52 +01001354 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001355#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001356
Simon Butcher584a5472016-05-23 16:24:52 +01001357 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Gilles Peskine449bd832023-01-11 14:50:10 +01001358 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001359#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001360 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001361#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001362
Gilles Peskine449bd832023-01-11 14:50:10 +01001363 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1364 if (ret != 0) {
1365 return ret;
1366 }
Simon Butcher584a5472016-05-23 16:24:52 +01001367 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001368
Jerry Yue7541932022-01-28 10:21:24 +08001369#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001370 case MBEDTLS_TLS_EXT_SIG_ALG:
Gilles Peskine449bd832023-01-11 14:50:10 +01001371 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001372
Gilles Peskine449bd832023-01-11 14:50:10 +01001373 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1374 if (ret != 0) {
1375 return ret;
1376 }
Hanno Becker7e5437a2017-04-28 17:15:26 +01001377
1378 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001379 break;
Jerry Yue7541932022-01-28 10:21:24 +08001380#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001381
Valerio Setti1fa5c562023-03-20 13:56:38 +01001382#if defined(MBEDTLS_PK_CAN_ECDH) || defined(MBEDTLS_PK_CAN_ECDSA_SOME) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001383 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yub47d0f82021-12-20 17:34:40 +08001384 case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001385 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001386
Gilles Peskine449bd832023-01-11 14:50:10 +01001387 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1388 if (ret != 0) {
1389 return ret;
1390 }
Simon Butcher584a5472016-05-23 16:24:52 +01001391 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001392
Simon Butcher584a5472016-05-23 16:24:52 +01001393 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Gilles Peskine449bd832023-01-11 14:50:10 +01001394 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
Simon Butcher584a5472016-05-23 16:24:52 +01001395 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001396
Gilles Peskine449bd832023-01-11 14:50:10 +01001397 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1398 if (ret != 0) {
1399 return ret;
1400 }
Simon Butcher584a5472016-05-23 16:24:52 +01001401 break;
Valerio Setti1fa5c562023-03-20 13:56:38 +01001402#endif /* MBEDTLS_PK_CAN_ECDH || MBEDTLS_PK_CAN_ECDSA_SOME ||
Robert Cragieae8535d2015-10-06 17:11:18 +01001403 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001404
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001405#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001406 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001407 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001408
Gilles Peskine449bd832023-01-11 14:50:10 +01001409 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1410 if (ret != 0) {
1411 return ret;
1412 }
Simon Butcher584a5472016-05-23 16:24:52 +01001413 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001414#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1415
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001416#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001417 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Gilles Peskine449bd832023-01-11 14:50:10 +01001418 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001419
Gilles Peskine449bd832023-01-11 14:50:10 +01001420 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1421 if (ret != 0) {
1422 return ret;
1423 }
Simon Butcher584a5472016-05-23 16:24:52 +01001424 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001425#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001426
Hanno Beckera0e20d02019-05-15 14:03:01 +01001427#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001428 case MBEDTLS_TLS_EXT_CID:
Gilles Peskine449bd832023-01-11 14:50:10 +01001429 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001430
Gilles Peskine449bd832023-01-11 14:50:10 +01001431 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1432 if (ret != 0) {
1433 return ret;
1434 }
Hanno Becker89dcc882019-04-26 13:56:39 +01001435 break;
Thomas Daubneye1c9a402021-06-15 11:26:43 +01001436#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001437
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001438#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001439 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Gilles Peskine449bd832023-01-11 14:50:10 +01001440 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001441
Gilles Peskine449bd832023-01-11 14:50:10 +01001442 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1443 if (ret != 0) {
1444 return ret;
1445 }
Simon Butcher584a5472016-05-23 16:24:52 +01001446 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001447#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001448
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001449#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001450 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001451 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001452
Gilles Peskine449bd832023-01-11 14:50:10 +01001453 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1454 if (ret != 0) {
1455 return ret;
1456 }
Simon Butcher584a5472016-05-23 16:24:52 +01001457 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001458#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001459
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001460#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001461 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Gilles Peskine449bd832023-01-11 14:50:10 +01001462 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001463
Gilles Peskine449bd832023-01-11 14:50:10 +01001464 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1465 if (ret != 0) {
1466 return ret;
1467 }
Simon Butcher584a5472016-05-23 16:24:52 +01001468 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001469#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001470
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001471#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001472 case MBEDTLS_TLS_EXT_ALPN:
Gilles Peskine449bd832023-01-11 14:50:10 +01001473 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001474
Gilles Peskine449bd832023-01-11 14:50:10 +01001475 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1476 ext + 4 + ext_size);
1477 if (ret != 0) {
1478 return ret;
1479 }
Simon Butcher584a5472016-05-23 16:24:52 +01001480 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001481#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001482
Johan Pascalb62bb512015-12-03 21:56:45 +01001483#if defined(MBEDTLS_SSL_DTLS_SRTP)
1484 case MBEDTLS_TLS_EXT_USE_SRTP:
Gilles Peskine449bd832023-01-11 14:50:10 +01001485 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001486
Gilles Peskine449bd832023-01-11 14:50:10 +01001487 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1488 if (ret != 0) {
1489 return ret;
1490 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001491 break;
1492#endif /* MBEDTLS_SSL_DTLS_SRTP */
1493
Simon Butcher584a5472016-05-23 16:24:52 +01001494 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001495 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1496 ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001497 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001498
Gilles Peskine449bd832023-01-11 14:50:10 +01001499 ext_len -= 4 + ext_size;
1500 ext += 4 + ext_size;
1501 }
1502
Jerry Yue7541932022-01-28 10:21:24 +08001503#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001504
1505 /*
1506 * Try to fall back to default hash SHA1 if the client
1507 * hasn't provided any preferred signature-hash combinations.
1508 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001509 if (!sig_hash_alg_ext_present) {
Gabor Mezei86acf052022-05-10 13:29:02 +02001510 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1511 const uint16_t default_sig_algs[] = {
Valerio Setti1fa5c562023-03-20 13:56:38 +01001512#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
Gilles Peskine449bd832023-01-11 14:50:10 +01001513 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1514 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001515#endif
1516#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001517 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1518 MBEDTLS_SSL_HASH_SHA1),
Gabor Mezeic1051b62022-05-10 13:13:58 +02001519#endif
Gabor Mezei86acf052022-05-10 13:29:02 +02001520 MBEDTLS_TLS_SIG_NONE
Gabor Mezei078e8032022-04-27 21:17:56 +02001521 };
Hanno Becker7e5437a2017-04-28 17:15:26 +01001522
Tom Cosgrove6ef9bb32023-03-08 14:19:51 +00001523 MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1524 <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1525 "default_sig_algs is too big");
Gabor Mezei078e8032022-04-27 21:17:56 +02001526
Gilles Peskine449bd832023-01-11 14:50:10 +01001527 memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001528 }
1529
Jerry Yue7541932022-01-28 10:21:24 +08001530#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001531
Paul Bakker48916f92012-09-16 19:57:18 +00001532 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001533 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1534 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001535 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1536 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1537 MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001538#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001539 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1540 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1541 "during renegotiation"));
1542 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1543 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1544 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001545 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001546#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001547 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001548 break;
1549 }
1550 }
1551
1552 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001553 * Renegotiation security checks
1554 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001555 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1556 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1557 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001558 handshake_failure = 1;
1559 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001560#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001561 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001562 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001563 renegotiation_info_seen == 0) {
1564 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001565 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001566 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1567 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1568 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1569 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001570 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001571 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1572 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1573 renegotiation_info_seen == 1) {
1574 MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001575 handshake_failure = 1;
1576 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001577#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001578
Gilles Peskine449bd832023-01-11 14:50:10 +01001579 if (handshake_failure == 1) {
1580 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1581 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1582 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001583 }
Paul Bakker380da532012-04-18 16:10:25 +00001584
Paul Bakker41c83d32013-03-20 14:39:14 +01001585 /*
Glenn Strauss2ed95272022-01-21 18:02:17 -05001586 * Server certification selection (after processing TLS extensions)
1587 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001588 if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1589 MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1590 return ret;
Glenn Strauss2ed95272022-01-21 18:02:17 -05001591 }
Glenn Strauss69894072022-01-24 12:58:00 -05001592#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1593 ssl->handshake->sni_name = NULL;
1594 ssl->handshake->sni_name_len = 0;
1595#endif
Glenn Strauss2ed95272022-01-21 18:02:17 -05001596
1597 /*
Paul Bakker41c83d32013-03-20 14:39:14 +01001598 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001599 * (At the end because we need information from the EC-based extensions
Glenn Strauss2ed95272022-01-21 18:02:17 -05001600 * and certificate from the SNI callback triggered by the SNI extension
1601 * or certificate from server certificate selection callback.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001602 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001603 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001604 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001605 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001606
Gilles Peskine449bd832023-01-11 14:50:10 +01001607 if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1608 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1609 for (i = 0; ciphersuites[i] != 0; i++) {
1610 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001611 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001612 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001613
TRodziewicz8476f2f2021-06-02 14:34:47 +02001614 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001615
Gilles Peskine449bd832023-01-11 14:50:10 +01001616 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1617 &ciphersuite_info)) != 0) {
1618 return ret;
1619 }
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001620
Gilles Peskine449bd832023-01-11 14:50:10 +01001621 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001622 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001623 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001624 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001625 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001626 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +01001627 for (i = 0; ciphersuites[i] != 0; i++) {
1628 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1629 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001630 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001631 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001632
1633 got_common_suite = 1;
1634
Gilles Peskine449bd832023-01-11 14:50:10 +01001635 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1636 &ciphersuite_info)) != 0) {
1637 return ret;
1638 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001639
Gilles Peskine449bd832023-01-11 14:50:10 +01001640 if (ciphersuite_info != NULL) {
TRodziewicz8476f2f2021-06-02 14:34:47 +02001641 goto have_ciphersuite;
Gilles Peskine449bd832023-01-11 14:50:10 +01001642 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001643 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001644 }
TRodziewicz8476f2f2021-06-02 14:34:47 +02001645 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001646
Gilles Peskine449bd832023-01-11 14:50:10 +01001647 if (got_common_suite) {
1648 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1649 "but none of them usable"));
1650 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1651 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1652 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1653 } else {
1654 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1655 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1656 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1657 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001658 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001659
1660have_ciphersuite:
Gilles Peskine449bd832023-01-11 14:50:10 +01001661 MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001662
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001663 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001664 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001665
Paul Bakker5121ce52009-01-03 21:22:43 +00001666 ssl->state++;
1667
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001668#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001669 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1670 mbedtls_ssl_recv_flight_completed(ssl);
1671 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001672#endif
1673
Hanno Becker7e5437a2017-04-28 17:15:26 +01001674 /* Debugging-only output for testsuite */
1675#if defined(MBEDTLS_DEBUG_C) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001676 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001677 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1678 if (sig_alg != MBEDTLS_PK_NONE) {
Gabor Mezeia3d016c2022-05-10 12:44:09 +02001679 unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01001680 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1681 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1682 sig_hash));
1683 } else {
1684 MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1685 "%u - should not happen", (unsigned) sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001686 }
1687#endif
1688
Gilles Peskine449bd832023-01-11 14:50:10 +01001689 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001690
Gilles Peskine449bd832023-01-11 14:50:10 +01001691 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001692}
1693
Hanno Beckera0e20d02019-05-15 14:03:01 +01001694#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001695static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1696 unsigned char *buf,
1697 size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001698{
1699 unsigned char *p = buf;
1700 size_t ext_len;
1701 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1702
1703 *olen = 0;
1704
1705 /* Skip writing the extension if we don't want to use it or if
1706 * the client hasn't offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001707 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker51de2d32019-04-26 15:46:55 +01001708 return;
1709 }
1710
Gilles Peskine449bd832023-01-11 14:50:10 +01001711 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1712 * which is at most 255, so the increment cannot overflow. */
1713 if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1714 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1715 return;
1716 }
1717
1718 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001719
1720 /*
Hanno Becker51de2d32019-04-26 15:46:55 +01001721 * struct {
1722 * opaque cid<0..2^8-1>;
1723 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +01001724 */
1725 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001726 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001727 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001728 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001729 p += 2;
Hanno Becker51de2d32019-04-26 15:46:55 +01001730
1731 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001732 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001733
1734 *olen = ssl->own_cid_len + 5;
1735}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001736#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001737
Neil Armstrong76b74072022-04-06 13:43:54 +02001738#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01001739static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1740 unsigned char *buf,
1741 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001742{
1743 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001744 const mbedtls_ssl_ciphersuite_t *suite = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001745
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001746 /*
1747 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1748 * from a client and then selects a stream or Authenticated Encryption
1749 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1750 * encrypt-then-MAC response extension back to the client."
1751 */
Neil Armstrongfe635e42022-04-01 10:36:09 +02001752 suite = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001753 ssl->session_negotiate->ciphersuite);
1754 if (suite == NULL) {
Ronald Cron862902d2022-03-24 14:15:28 +01001755 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001756 } else {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001757 mbedtls_ssl_mode_t ssl_mode =
Neil Armstrongab555e02022-04-04 11:07:59 +02001758 mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongfe635e42022-04-01 10:36:09 +02001759 ssl->session_negotiate->encrypt_then_mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001760 suite);
Neil Armstrongfe635e42022-04-01 10:36:09 +02001761
Gilles Peskine449bd832023-01-11 14:50:10 +01001762 if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
Neil Armstrongfe635e42022-04-01 10:36:09 +02001763 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
Gilles Peskine449bd832023-01-11 14:50:10 +01001764 }
Ronald Cron862902d2022-03-24 14:15:28 +01001765 }
1766
Gilles Peskine449bd832023-01-11 14:50:10 +01001767 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001768 *olen = 0;
1769 return;
1770 }
1771
Gilles Peskine449bd832023-01-11 14:50:10 +01001772 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001773
Gilles Peskine449bd832023-01-11 14:50:10 +01001774 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001775 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001776
1777 *p++ = 0x00;
1778 *p++ = 0x00;
1779
1780 *olen = 4;
1781}
Neil Armstrong76b74072022-04-06 13:43:54 +02001782#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001783
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001784#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001785static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1786 unsigned char *buf,
1787 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001788{
1789 unsigned char *p = buf;
1790
Gilles Peskine449bd832023-01-11 14:50:10 +01001791 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001792 *olen = 0;
1793 return;
1794 }
1795
Gilles Peskine449bd832023-01-11 14:50:10 +01001796 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1797 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001798
Gilles Peskine449bd832023-01-11 14:50:10 +01001799 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001800 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001801
1802 *p++ = 0x00;
1803 *p++ = 0x00;
1804
1805 *olen = 4;
1806}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001807#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001808
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001809#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001810static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1811 unsigned char *buf,
1812 size_t *olen)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001813{
1814 unsigned char *p = buf;
1815
Gilles Peskine449bd832023-01-11 14:50:10 +01001816 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001817 *olen = 0;
1818 return;
1819 }
1820
Gilles Peskine449bd832023-01-11 14:50:10 +01001821 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001822
Gilles Peskine449bd832023-01-11 14:50:10 +01001823 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001824 p += 2;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001825
1826 *p++ = 0x00;
1827 *p++ = 0x00;
1828
1829 *olen = 4;
1830}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001831#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001832
Gilles Peskine449bd832023-01-11 14:50:10 +01001833static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1834 unsigned char *buf,
1835 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001836{
1837 unsigned char *p = buf;
1838
Gilles Peskine449bd832023-01-11 14:50:10 +01001839 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001840 *olen = 0;
1841 return;
1842 }
1843
Gilles Peskine449bd832023-01-11 14:50:10 +01001844 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001845
Gilles Peskine449bd832023-01-11 14:50:10 +01001846 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001847 p += 2;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001848
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001849#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001850 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001851 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +01001852 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001853 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001854
Gilles Peskine449bd832023-01-11 14:50:10 +01001855 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001856 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001857 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001858 p += ssl->verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001859 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001860#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001861 {
1862 *p++ = 0x00;
1863 *p++ = 0x01;
1864 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001865 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02001866
1867 *olen = p - buf;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001868}
1869
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001870#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001871static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1872 unsigned char *buf,
1873 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001874{
1875 unsigned char *p = buf;
1876
Gilles Peskine449bd832023-01-11 14:50:10 +01001877 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001878 *olen = 0;
1879 return;
1880 }
1881
Gilles Peskine449bd832023-01-11 14:50:10 +01001882 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001883
Gilles Peskine449bd832023-01-11 14:50:10 +01001884 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001885 p += 2;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001886
1887 *p++ = 0x00;
1888 *p++ = 1;
1889
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001890 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001891
1892 *olen = 5;
1893}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001894#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001895
Valerio Setti7aeec542023-07-05 18:57:21 +02001896#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
1897 defined(MBEDTLS_ECDSA_C) || defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001898static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1899 unsigned char *buf,
1900 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001901{
1902 unsigned char *p = buf;
1903 ((void) ssl);
1904
Gilles Peskine449bd832023-01-11 14:50:10 +01001905 if ((ssl->handshake->cli_exts &
1906 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01001907 *olen = 0;
1908 return;
1909 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001910
Gilles Peskine449bd832023-01-11 14:50:10 +01001911 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001912
Gilles Peskine449bd832023-01-11 14:50:10 +01001913 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001914 p += 2;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001915
1916 *p++ = 0x00;
1917 *p++ = 2;
1918
1919 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001920 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001921
1922 *olen = 6;
1923}
Valerio Setti7aeec542023-07-05 18:57:21 +02001924#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || MBEDTLS_ECDSA_C ||
1925 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001926
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001927#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001928static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1929 unsigned char *buf,
1930 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001931{
Janos Follath865b3eb2019-12-16 11:46:15 +00001932 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001933 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10001934 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001935 size_t kkpp_len;
1936
1937 *olen = 0;
1938
1939 /* Skip costly computation if not needed */
Gilles Peskine449bd832023-01-11 14:50:10 +01001940 if (ssl->handshake->ciphersuite_info->key_exchange !=
1941 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001942 return;
1943 }
1944
Gilles Peskine449bd832023-01-11 14:50:10 +01001945 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1946
1947 if (end - p < 4) {
1948 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1949 return;
1950 }
1951
1952 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001953 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001954
Neil Armstrongca7d5062022-05-31 14:43:23 +02001955#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01001956 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
1957 p + 2, end - p - 2, &kkpp_len,
1958 MBEDTLS_ECJPAKE_ROUND_ONE);
1959 if (ret != 0) {
1960 psa_destroy_key(ssl->handshake->psa_pake_password);
1961 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1962 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
Valerio Settia9883642022-11-17 15:34:59 +01001963 return;
Neil Armstrongca7d5062022-05-31 14:43:23 +02001964 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001965#else
Gilles Peskine449bd832023-01-11 14:50:10 +01001966 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
1967 p + 2, end - p - 2, &kkpp_len,
1968 ssl->conf->f_rng, ssl->conf->p_rng);
1969 if (ret != 0) {
1970 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001971 return;
1972 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02001973#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001974
Gilles Peskine449bd832023-01-11 14:50:10 +01001975 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001976 p += 2;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02001977
1978 *olen = kkpp_len + 4;
1979}
1980#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1981
Gilles Peskine449bd832023-01-11 14:50:10 +01001982#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
1983static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1984 unsigned char *buf,
1985 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01001986{
Ron Eldor75870ec2018-12-06 17:31:55 +02001987 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02001988 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02001989 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1990
1991 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02001992
Gilles Peskine449bd832023-01-11 14:50:10 +01001993 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1994 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01001995 return;
1996 }
1997
Gilles Peskine449bd832023-01-11 14:50:10 +01001998 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001999
Gilles Peskine449bd832023-01-11 14:50:10 +01002000 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02002001 mki_len = ssl->dtls_srtp_info.mki_len;
2002 }
2003
Johan Pascal9bc97ca2020-09-21 23:44:45 +02002004 /* The extension total size is 9 bytes :
2005 * - 2 bytes for the extension tag
2006 * - 2 bytes for the total size
2007 * - 2 bytes for the protection profile length
2008 * - 2 bytes for the protection profile
2009 * - 1 byte for the mki length
2010 * + the actual mki length
2011 * Check we have enough room in the output buffer */
Gilles Peskine449bd832023-01-11 14:50:10 +01002012 if ((size_t) (end - buf) < mki_len + 9) {
2013 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02002014 return;
2015 }
2016
Johan Pascalb62bb512015-12-03 21:56:45 +01002017 /* extension */
Gilles Peskine449bd832023-01-11 14:50:10 +01002018 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
Ron Eldoref72faf2018-07-12 11:54:20 +03002019 /*
2020 * total length 5 and mki value: only one profile(2 bytes)
2021 * and length(2 bytes) and srtp_mki )
2022 */
Ron Eldor591f1622018-01-22 12:30:04 +02002023 ext_len = 5 + mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002024 MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
Johan Pascalb62bb512015-12-03 21:56:45 +01002025
2026 /* protection profile length: 2 */
2027 buf[4] = 0x00;
2028 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02002029 profile_value = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01002030 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2031 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2032 MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
2033 } else {
2034 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02002035 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01002036 }
2037
Ron Eldor591f1622018-01-22 12:30:04 +02002038 buf[8] = mki_len & 0xFF;
Gilles Peskine449bd832023-01-11 14:50:10 +01002039 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01002040
Ron Eldor591f1622018-01-22 12:30:04 +02002041 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01002042}
2043#endif /* MBEDTLS_SSL_DTLS_SRTP */
2044
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002045#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002046MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002047static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002048{
Janos Follath865b3eb2019-12-16 11:46:15 +00002049 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002050 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002051 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002052
Gilles Peskine449bd832023-01-11 14:50:10 +01002053 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002054
2055 /*
2056 * struct {
2057 * ProtocolVersion server_version;
2058 * opaque cookie<0..2^8-1>;
2059 * } HelloVerifyRequest;
2060 */
2061
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002062 /* The RFC is not clear on this point, but sending the actual negotiated
2063 * version looks like the most interoperable thing to do. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002064 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2065 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002066 p += 2;
2067
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002068 /* If we get here, f_cookie_check is not null */
Gilles Peskine449bd832023-01-11 14:50:10 +01002069 if (ssl->conf->f_cookie_write == NULL) {
2070 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2071 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002072 }
2073
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002074 /* Skip length byte until we know the length */
2075 cookie_len_byte = p++;
2076
Gilles Peskine449bd832023-01-11 14:50:10 +01002077 if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2078 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2079 ssl->cli_id, ssl->cli_id_len)) != 0) {
2080 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2081 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002082 }
2083
Gilles Peskine449bd832023-01-11 14:50:10 +01002084 *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002085
Gilles Peskine449bd832023-01-11 14:50:10 +01002086 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002087
2088 ssl->out_msglen = p - ssl->out_msg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002089 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2090 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002091
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002092 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002093
Gilles Peskine449bd832023-01-11 14:50:10 +01002094 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2095 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2096 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002097 }
2098
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002099#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002100 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2101 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2102 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2103 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002104 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002105#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002106
Gilles Peskine449bd832023-01-11 14:50:10 +01002107 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002108
Gilles Peskine449bd832023-01-11 14:50:10 +01002109 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002110}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002111#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002112
Gilles Peskine449bd832023-01-11 14:50:10 +01002113static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002114{
2115 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002116 mbedtls_ssl_session session_tmp;
Hanno Becker64ce9742021-04-15 08:19:40 +01002117 mbedtls_ssl_session * const session = ssl->session_negotiate;
2118
2119 /* Resume is 0 by default, see ssl_handshake_init().
2120 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Gilles Peskine449bd832023-01-11 14:50:10 +01002121 if (ssl->handshake->resume == 1) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002122 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002123 }
2124 if (session->id_len == 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002125 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002126 }
2127 if (ssl->conf->f_get_cache == NULL) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002128 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002129 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002130#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002131 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002132 return;
Gilles Peskine449bd832023-01-11 14:50:10 +01002133 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002134#endif
2135
Gilles Peskine449bd832023-01-11 14:50:10 +01002136 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002137
Gilles Peskine449bd832023-01-11 14:50:10 +01002138 ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2139 session->id,
2140 session->id_len,
2141 &session_tmp);
2142 if (ret != 0) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002143 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +01002144 }
Hanno Becker64ce9742021-04-15 08:19:40 +01002145
Gilles Peskine449bd832023-01-11 14:50:10 +01002146 if (session->ciphersuite != session_tmp.ciphersuite) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002147 /* Mismatch between cached and negotiated session */
2148 goto exit;
2149 }
2150
2151 /* Move semantics */
Gilles Peskine449bd832023-01-11 14:50:10 +01002152 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002153 *session = session_tmp;
Gilles Peskine449bd832023-01-11 14:50:10 +01002154 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002155
Gilles Peskine449bd832023-01-11 14:50:10 +01002156 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002157 ssl->handshake->resume = 1;
2158
2159exit:
2160
Gilles Peskine449bd832023-01-11 14:50:10 +01002161 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002162}
2163
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002164MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002165static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002166{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002167#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002168 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002169#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002170 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002171 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002172 unsigned char *buf, *p;
2173
Gilles Peskine449bd832023-01-11 14:50:10 +01002174 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002175
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002176#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Gilles Peskine449bd832023-01-11 14:50:10 +01002177 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2178 ssl->handshake->cookie_verify_result != 0) {
2179 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2180 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002181
Gilles Peskine449bd832023-01-11 14:50:10 +01002182 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002183 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002184#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002185
Gilles Peskine449bd832023-01-11 14:50:10 +01002186 if (ssl->conf->f_rng == NULL) {
2187 MBEDTLS_SSL_DEBUG_MSG(1, ("no RNG provided"));
2188 return MBEDTLS_ERR_SSL_NO_RNG;
Paul Bakkera9a028e2013-11-21 17:31:06 +01002189 }
2190
Paul Bakker5121ce52009-01-03 21:22:43 +00002191 /*
2192 * 0 . 0 handshake type
2193 * 1 . 3 handshake length
2194 * 4 . 5 protocol version
2195 * 6 . 9 UNIX time()
2196 * 10 . 37 random bytes
2197 */
2198 buf = ssl->out_msg;
2199 p = buf + 4;
2200
Gilles Peskine449bd832023-01-11 14:50:10 +01002201 mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002202 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002203
Gilles Peskine449bd832023-01-11 14:50:10 +01002204 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2205 buf[4], buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002206
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002207#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002208 t = mbedtls_time(NULL);
2209 MBEDTLS_PUT_UINT32_BE(t, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002210 p += 4;
Paul Bakker5121ce52009-01-03 21:22:43 +00002211
Gilles Peskine449bd832023-01-11 14:50:10 +01002212 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2213 (long long) t));
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002214#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002215 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2216 return ret;
2217 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002218
2219 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002220#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002221
Ronald Cronc5649382023-04-04 15:33:42 +02002222 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002223 return ret;
2224 }
Ronald Cronc5649382023-04-04 15:33:42 +02002225 p += 20;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002226
Ronald Cronc5649382023-04-04 15:33:42 +02002227#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2228 /*
2229 * RFC 8446
2230 * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2231 * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2232 * response to a ClientHello MUST set the last 8 bytes of their Random
2233 * value specially in their ServerHello.
2234 */
2235 if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2236 static const unsigned char magic_tls12_downgrade_string[] =
2237 { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2238
2239 MBEDTLS_STATIC_ASSERT(
2240 sizeof(magic_tls12_downgrade_string) == 8,
2241 "magic_tls12_downgrade_string does not have the expected size");
2242
Ronald Cronfe01ec22023-04-06 09:56:53 +02002243 memcpy(p, magic_tls12_downgrade_string,
2244 sizeof(magic_tls12_downgrade_string));
Ronald Cronc5649382023-04-04 15:33:42 +02002245 } else
2246#endif
2247 {
2248 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2249 return ret;
2250 }
2251 }
2252 p += 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00002253
Gilles Peskine449bd832023-01-11 14:50:10 +01002254 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002255
Gilles Peskine449bd832023-01-11 14:50:10 +01002256 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002257
Gilles Peskine449bd832023-01-11 14:50:10 +01002258 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002259
Gilles Peskine449bd832023-01-11 14:50:10 +01002260 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002261 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002262 * New session, create a new session id,
2263 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002264 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002265 ssl->state++;
2266
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002267#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01002268 ssl->session_negotiate->start = mbedtls_time(NULL);
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002269#endif
2270
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002271#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002272 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002273 ssl->session_negotiate->id_len = n = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002274 memset(ssl->session_negotiate->id, 0, 32);
2275 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002276#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002277 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002278 ssl->session_negotiate->id_len = n = 32;
Gilles Peskine449bd832023-01-11 14:50:10 +01002279 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2280 n)) != 0) {
2281 return ret;
2282 }
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002283 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002284 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002285 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002286 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002287 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002288 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002289 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002290
Gilles Peskine449bd832023-01-11 14:50:10 +01002291 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2292 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2293 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002294 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002295 }
2296
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002297 /*
2298 * 38 . 38 session id length
2299 * 39 . 38+n session id
2300 * 39+n . 40+n chosen ciphersuite
2301 * 41+n . 41+n chosen compression alg.
2302 * 42+n . 43+n extensions length
2303 * 44+n . 43+n+m extensions
2304 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002305 *p++ = (unsigned char) ssl->session_negotiate->id_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002306 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002307 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002308
Gilles Peskine449bd832023-01-11 14:50:10 +01002309 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2310 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2311 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2312 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002313
Gilles Peskine449bd832023-01-11 14:50:10 +01002314 MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002315 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002316 *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
Paul Bakker5121ce52009-01-03 21:22:43 +00002317
Gilles Peskine449bd832023-01-11 14:50:10 +01002318 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2319 mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2320 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2321 (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
Paul Bakker48916f92012-09-16 19:57:18 +00002322
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002323 /*
2324 * First write extensions, then the total length
2325 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002326 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002327 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002328
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002329#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002330 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002331 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002332#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002333
Hanno Beckera0e20d02019-05-15 14:03:01 +01002334#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01002335 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002336 ext_len += olen;
2337#endif
2338
Neil Armstrong76b74072022-04-06 13:43:54 +02002339#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskine449bd832023-01-11 14:50:10 +01002340 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002341 ext_len += olen;
2342#endif
2343
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002344#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01002345 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002346 ext_len += olen;
2347#endif
2348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002349#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002350 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002351 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002352#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002353
Valerio Setti7aeec542023-07-05 18:57:21 +02002354#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
2355 defined(MBEDTLS_ECDSA_C) || defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Leonid Rozenboim28752702022-04-21 18:00:52 -07002356 const mbedtls_ssl_ciphersuite_t *suite =
Gilles Peskine449bd832023-01-11 14:50:10 +01002357 mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2358 if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2359 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002360 ext_len += olen;
2361 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002362#endif
2363
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002364#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002365 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002366 ext_len += olen;
2367#endif
2368
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002369#if defined(MBEDTLS_SSL_ALPN)
XiaokangQianacb39922022-06-17 10:18:48 +00002370 unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01002371 if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2372 != 0) {
Paul Elliottf518f812022-07-11 12:36:20 +01002373 return ret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002374 }
Paul Elliottf518f812022-07-11 12:36:20 +01002375
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002376 ext_len += olen;
2377#endif
2378
Johan Pascalb62bb512015-12-03 21:56:45 +01002379#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01002380 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002381 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01002382#endif
2383
Gilles Peskine449bd832023-01-11 14:50:10 +01002384 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2385 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002386
Gilles Peskine449bd832023-01-11 14:50:10 +01002387 if (ext_len > 0) {
2388 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani94180e72021-08-20 16:20:44 +01002389 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02002390 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002391
2392 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002393 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2394 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002395
Gilles Peskine449bd832023-01-11 14:50:10 +01002396 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002397
Gilles Peskine449bd832023-01-11 14:50:10 +01002398 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002399
Gilles Peskine449bd832023-01-11 14:50:10 +01002400 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002401}
2402
Gilles Peskineeccd8882020-03-10 12:19:08 +01002403#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002404MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002405static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002406{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002407 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002408 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002409
Gilles Peskine449bd832023-01-11 14:50:10 +01002410 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002411
Gilles Peskine449bd832023-01-11 14:50:10 +01002412 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2413 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002414 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002415 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002416 }
2417
Gilles Peskine449bd832023-01-11 14:50:10 +01002418 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2419 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002420}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002421#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002422MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002423static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002424{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002425 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002426 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002427 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002428 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002429 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002430 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002431 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002432 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002433 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002434
Gilles Peskine449bd832023-01-11 14:50:10 +01002435 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002436
2437 ssl->state++;
2438
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002439#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002440 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002441 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +01002442 } else
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002443#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002444 authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002445
Gilles Peskine449bd832023-01-11 14:50:10 +01002446 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2447 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2448 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2449 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002450 }
2451
2452 /*
2453 * 0 . 0 handshake type
2454 * 1 . 3 handshake length
2455 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002456 * 5 .. m-1 cert types
2457 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002458 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002459 * n .. n+1 length of all DNs
2460 * n+2 .. n+3 length of DN 1
2461 * n+4 .. ... Distinguished Name #1
2462 * ... .. ... length of DN 2, etc.
2463 */
2464 buf = ssl->out_msg;
2465 p = buf + 4;
2466
2467 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002468 * Supported certificate types
2469 *
2470 * ClientCertificateType certificate_types<1..2^8-1>;
2471 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002472 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002473 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002474
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002475#if defined(MBEDTLS_RSA_C)
2476 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002477#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002478#if defined(MBEDTLS_ECDSA_C)
2479 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002480#endif
2481
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002482 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002483 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002484
Paul Bakker577e0062013-08-28 11:57:20 +02002485 sa_len = 0;
Jerry Yue7541932022-01-28 10:21:24 +08002486
Paul Bakker926af752012-11-23 13:38:07 +01002487 /*
2488 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002489 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002490 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2491 *
2492 * struct {
2493 * HashAlgorithm hash;
2494 * SignatureAlgorithm signature;
2495 * } SignatureAndHashAlgorithm;
2496 *
2497 * enum { (255) } HashAlgorithm;
2498 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002499 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002500 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2501 if (sig_alg == NULL) {
2502 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2503 }
Ronald Cron8457c122022-03-07 11:32:54 +01002504
Gilles Peskine449bd832023-01-11 14:50:10 +01002505 for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2506 unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
Jerry Yu6106fdc2022-01-12 16:36:14 +08002507
Gilles Peskine449bd832023-01-11 14:50:10 +01002508 if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002509 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002510 }
2511 if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
Ronald Cron8457c122022-03-07 11:32:54 +01002512 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01002513 }
Simon Butcher99000142016-10-13 17:21:01 +01002514
Paul Elliott96a0fd92022-11-08 17:09:56 +00002515 /* Write elements at offsets starting from 1 (offset 0 is for the
2516 * length). Thus the offset of each element is the length of the
2517 * partial list including that element. */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002518 sa_len += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002519 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
Paul Elliott96a0fd92022-11-08 17:09:56 +00002520
Paul Bakker926af752012-11-23 13:38:07 +01002521 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002522
Paul Elliott96a0fd92022-11-08 17:09:56 +00002523 /* Fill in list length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002524 MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
Ronald Cron8457c122022-03-07 11:32:54 +01002525 sa_len += 2;
2526 p += sa_len;
2527
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002528 /*
2529 * DistinguishedName certificate_authorities<0..2^16-1>;
2530 * opaque DistinguishedName<1..2^16-1>;
2531 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002532 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002533
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002534 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002535
Gilles Peskine449bd832023-01-11 14:50:10 +01002536 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002537 /* NOTE: If trusted certificates are provisioned
2538 * via a CA callback (configured through
2539 * `mbedtls_ssl_conf_ca_cb()`, then the
2540 * CertificateRequest is currently left empty. */
2541
Glenn Strauss999ef702022-03-11 01:37:23 -05002542#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2543#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002544 if (ssl->handshake->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002545 crt = ssl->handshake->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002546 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002547#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002548 if (ssl->conf->dn_hints != NULL) {
Glenn Strauss999ef702022-03-11 01:37:23 -05002549 crt = ssl->conf->dn_hints;
Gilles Peskine449bd832023-01-11 14:50:10 +01002550 } else
Glenn Strauss999ef702022-03-11 01:37:23 -05002551#endif
Janos Follath088ce432017-04-10 12:42:31 +01002552#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01002553 if (ssl->handshake->sni_ca_chain != NULL) {
Janos Follath088ce432017-04-10 12:42:31 +01002554 crt = ssl->handshake->sni_ca_chain;
Gilles Peskine449bd832023-01-11 14:50:10 +01002555 } else
Janos Follath088ce432017-04-10 12:42:31 +01002556#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002557 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002558
Gilles Peskine449bd832023-01-11 14:50:10 +01002559 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002560 /* It follows from RFC 5280 A.1 that this length
2561 * can be represented in at most 11 bits. */
2562 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002563
Gilles Peskine449bd832023-01-11 14:50:10 +01002564 if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2565 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002566 break;
2567 }
2568
Gilles Peskine449bd832023-01-11 14:50:10 +01002569 MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01002570 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002571 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002572 p += dn_size;
2573
Gilles Peskine449bd832023-01-11 14:50:10 +01002574 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002575
2576 total_dn_size += 2 + dn_size;
2577 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002578 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002579 }
2580
Paul Bakker926af752012-11-23 13:38:07 +01002581 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002582 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2583 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Gilles Peskine449bd832023-01-11 14:50:10 +01002584 MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
Paul Bakker5121ce52009-01-03 21:22:43 +00002585
Gilles Peskine449bd832023-01-11 14:50:10 +01002586 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002587
Gilles Peskine449bd832023-01-11 14:50:10 +01002588 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002589
Gilles Peskine449bd832023-01-11 14:50:10 +01002590 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002591}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002592#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002593
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002594#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +01002595 (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2596 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002597MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002598static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002599{
2600 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2601 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002602 mbedtls_pk_context *pk;
2603 mbedtls_pk_type_t pk_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002604 psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002605#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002606 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002607 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002608 size_t key_len;
Valerio Setti97207782023-05-18 18:59:06 +02002609 mbedtls_ecp_group_id grp_id;
Valerio Setti3589a4c2023-06-22 09:02:44 +02002610 unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
Valerio Setti0813b6f2023-06-16 12:18:53 +02002611 mbedtls_ecp_keypair *key;
2612#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002613
Gilles Peskine449bd832023-01-11 14:50:10 +01002614 pk = mbedtls_ssl_own_key(ssl);
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002615
Gilles Peskine449bd832023-01-11 14:50:10 +01002616 if (pk == NULL) {
2617 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2618 }
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002619
Valerio Setti0813b6f2023-06-16 12:18:53 +02002620 pk_type = mbedtls_pk_get_type(pk);
Valerio Settid0405092023-05-24 13:16:40 +02002621
Valerio Setti0813b6f2023-06-16 12:18:53 +02002622 switch (pk_type) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002623 case MBEDTLS_PK_OPAQUE:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002624#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2625 case MBEDTLS_PK_ECKEY:
2626 case MBEDTLS_PK_ECKEY_DH:
2627 case MBEDTLS_PK_ECDSA:
2628#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002629 if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2630 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2631 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002632
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002633 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
Neil Armstronge88d1902022-04-04 11:25:23 +02002634
Przemek Stekiel6f199852023-06-29 08:59:26 +02002635 /* Key should not be destroyed in the TLS library */
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002636 ssl->handshake->xxdh_psa_privkey_is_external = 1;
Przemek Stekiel6f199852023-06-29 08:59:26 +02002637
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002638 status = psa_get_key_attributes(ssl->handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002639 &key_attributes);
2640 if (status != PSA_SUCCESS) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002641 ssl->handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002642 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002643 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002644
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002645 ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
2646 ssl->handshake->xxdh_bits = psa_get_key_bits(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002647
Gilles Peskine449bd832023-01-11 14:50:10 +01002648 psa_reset_key_attributes(&key_attributes);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002649
Gilles Peskine449bd832023-01-11 14:50:10 +01002650 ret = 0;
2651 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002652#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01002653 case MBEDTLS_PK_ECKEY:
2654 case MBEDTLS_PK_ECKEY_DH:
2655 case MBEDTLS_PK_ECDSA:
Valerio Setti0813b6f2023-06-16 12:18:53 +02002656 key = mbedtls_pk_ec_rw(*pk);
Valerio Settid0405092023-05-24 13:16:40 +02002657 grp_id = mbedtls_pk_get_group_id(pk);
2658 if (grp_id == MBEDTLS_ECP_DP_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002659 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2660 }
Valerio Setti97207782023-05-18 18:59:06 +02002661 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002662 if (tls_id == 0) {
2663 /* This elliptic curve is not supported */
2664 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2665 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002666
Gilles Peskine449bd832023-01-11 14:50:10 +01002667 /* If the above conversion to TLS ID was fine, then also this one will
2668 be, so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002669 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002670 &ssl->handshake->xxdh_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002671
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002672 ssl->handshake->xxdh_psa_type = key_type;
Neil Armstrong104a7c12022-03-23 10:58:03 +01002673
Gilles Peskine449bd832023-01-11 14:50:10 +01002674 key_attributes = psa_key_attributes_init();
2675 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2676 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2677 psa_set_key_type(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002678 PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2679 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_bits);
Neil Armstrong104a7c12022-03-23 10:58:03 +01002680
Gilles Peskine449bd832023-01-11 14:50:10 +01002681 key_len = PSA_BITS_TO_BYTES(key->grp.pbits);
2682 ret = mbedtls_ecp_write_key(key, buf, key_len);
2683 if (ret != 0) {
Valerio Setti0813b6f2023-06-16 12:18:53 +02002684 mbedtls_platform_zeroize(buf, sizeof(buf));
2685 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002686 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002687
Gilles Peskine449bd832023-01-11 14:50:10 +01002688 status = psa_import_key(&key_attributes, buf, key_len,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002689 &ssl->handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002690 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002691 ret = PSA_TO_MBEDTLS_ERR(status);
Valerio Setti0813b6f2023-06-16 12:18:53 +02002692 mbedtls_platform_zeroize(buf, sizeof(buf));
2693 break;
Gilles Peskine449bd832023-01-11 14:50:10 +01002694 }
Neil Armstrong104a7c12022-03-23 10:58:03 +01002695
Valerio Setti6835b4a2023-06-22 09:06:31 +02002696 mbedtls_platform_zeroize(buf, sizeof(buf));
Gilles Peskine449bd832023-01-11 14:50:10 +01002697 ret = 0;
2698 break;
Valerio Setti0813b6f2023-06-16 12:18:53 +02002699#endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
Gilles Peskine449bd832023-01-11 14:50:10 +01002700 default:
Neil Armstrong104a7c12022-03-23 10:58:03 +01002701 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002702 }
2703
Gilles Peskine449bd832023-01-11 14:50:10 +01002704 return ret;
Neil Armstrong1f4b3962022-03-09 14:54:29 +01002705}
2706#elif defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002707 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002708MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002709static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002710{
Janos Follath865b3eb2019-12-16 11:46:15 +00002711 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002712
Gilles Peskine449bd832023-01-11 14:50:10 +01002713 const mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
2714 if (private_key == NULL) {
2715 MBEDTLS_SSL_DEBUG_MSG(1, ("got no server private key"));
2716 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Leonid Rozenboim28752702022-04-21 18:00:52 -07002717 }
2718
Gilles Peskine449bd832023-01-11 14:50:10 +01002719 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_ECKEY)) {
2720 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2721 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002722 }
2723
Gilles Peskine449bd832023-01-11 14:50:10 +01002724 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
Valerio Setti77a75682023-05-15 11:18:46 +02002725 mbedtls_pk_ec_ro(*mbedtls_ssl_own_key(ssl)),
Gilles Peskine449bd832023-01-11 14:50:10 +01002726 MBEDTLS_ECDH_OURS)) != 0) {
2727 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2728 return ret;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002729 }
2730
Gilles Peskine449bd832023-01-11 14:50:10 +01002731 return 0;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002732}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002733#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2734 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002735
Gilles Peskineeccd8882020-03-10 12:19:08 +01002736#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002737 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002738MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002739static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2740 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002741{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002742 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2743 * signature length which will be added in ssl_write_server_key_exchange
2744 * after the call to ssl_prepare_server_key_exchange.
2745 * ssl_write_server_key_exchange also takes care of incrementing
2746 * ssl->out_msglen. */
2747 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01002748 size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2749 - sig_start);
2750 int ret = ssl->conf->f_async_resume(ssl,
2751 sig_start, signature_len, sig_max_len);
2752 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002753 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002754 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002755 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002756 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2757 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002758}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002759#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002760 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002761
Gilles Peskined3eb0612018-01-08 17:07:44 +01002762/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002763 * calculating the signature if any, but excluding formatting the
2764 * signature and sending the message. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002765MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002766static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2767 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002768{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002769 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002770 ssl->handshake->ciphersuite_info;
2771
Gilles Peskineeccd8882020-03-10 12:19:08 +01002772#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
Jerry Yuc5aef882021-12-23 20:15:02 +08002773#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002774 unsigned char *dig_signed = NULL;
Jerry Yuc5aef882021-12-23 20:15:02 +08002775#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002776#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002777
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002778 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002779#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02002780 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002781#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002782
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002783#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef00f1522021-06-22 00:09:00 +02002784#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01002785 size_t out_buf_len = ssl->out_buf_len - (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002786#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002787 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN - (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02002788#endif
Gilles Peskine16fe8fc2021-06-22 09:45:56 +02002789#endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002790
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002791 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002792
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002793 /*
2794 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002795 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002796 *
2797 */
2798
2799 /*
2800 * - ECJPAKE key exchanges
2801 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002802#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002803 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002804 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002805#if defined(MBEDTLS_USE_PSA_CRYPTO)
2806 unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2807 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2808 ssl->out_msglen;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002809 size_t output_offset = 0;
Valerio Setti02c25b52022-11-15 14:08:42 +01002810 size_t output_len = 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002811
Valerio Setti6f1b5742022-11-16 10:00:32 +01002812 /*
2813 * The first 3 bytes are:
2814 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2815 * [1, 2] elliptic curve's TLS ID
2816 *
2817 * However since we only support secp256r1 for now, we hardcode its
2818 * TLS ID here
2819 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002820 uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002821 MBEDTLS_ECP_DP_SECP256R1);
2822 if (tls_id == 0) {
2823 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti6f1b5742022-11-16 10:00:32 +01002824 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002825 *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002826 MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
Valerio Setti819de862022-11-17 18:05:19 +01002827 output_offset += 3;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002828
Gilles Peskine449bd832023-01-11 14:50:10 +01002829 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2830 out_p + output_offset,
2831 end_p - out_p - output_offset, &output_len,
2832 MBEDTLS_ECJPAKE_ROUND_TWO);
2833 if (ret != 0) {
2834 psa_destroy_key(ssl->handshake->psa_pake_password);
2835 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2836 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2837 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002838 }
2839
Valerio Setti02c25b52022-11-15 14:08:42 +01002840 output_offset += output_len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002841 ssl->out_msglen += output_offset;
2842#else
Simon Butcher600c5e62018-06-14 08:58:59 +01002843 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002844
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002845 ret = mbedtls_ecjpake_write_round_two(
2846 &ssl->handshake->ecjpake_ctx,
2847 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10002848 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Gilles Peskine449bd832023-01-11 14:50:10 +01002849 ssl->conf->f_rng, ssl->conf->p_rng);
2850 if (ret != 0) {
2851 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2852 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002853 }
2854
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002855 ssl->out_msglen += len;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002856#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002857 }
2858#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2859
Hanno Becker1aa267c2017-04-28 17:08:27 +01002860 /*
2861 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2862 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2863 * we use empty support identity hints here.
2864 **/
2865#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002866 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002867 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2868 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002869 ssl->out_msg[ssl->out_msglen++] = 0x00;
2870 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002871 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002872#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2873 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002874
Hanno Becker7e5437a2017-04-28 17:15:26 +01002875 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002876 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002877 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002878#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002879 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002880 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002881 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002882
Gilles Peskine449bd832023-01-11 14:50:10 +01002883 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2884 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2885 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002886 }
2887
Paul Bakker41c83d32013-03-20 14:39:14 +01002888 /*
2889 * Ephemeral DH parameters:
2890 *
2891 * struct {
2892 * opaque dh_p<1..2^16-1>;
2893 * opaque dh_g<1..2^16-1>;
2894 * opaque dh_Ys<1..2^16-1>;
2895 * } ServerDHParams;
2896 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002897 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2898 &ssl->conf->dhm_P,
2899 &ssl->conf->dhm_G)) != 0) {
2900 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2901 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002902 }
Paul Bakker48916f92012-09-16 19:57:18 +00002903
Gilles Peskine449bd832023-01-11 14:50:10 +01002904 if ((ret = mbedtls_dhm_make_params(
2905 &ssl->handshake->dhm_ctx,
2906 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2907 ssl->out_msg + ssl->out_msglen, &len,
2908 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2909 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2910 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002911 }
2912
Jerry Yuc5aef882021-12-23 20:15:02 +08002913#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002914 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002915#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002916
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002917 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002918
Gilles Peskine449bd832023-01-11 14:50:10 +01002919 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2920 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2921 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2922 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002923 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002924#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002925
Hanno Becker1aa267c2017-04-28 17:08:27 +01002926 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002927 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002928 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002929#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002930 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002931 /*
2932 * Ephemeral ECDH parameters:
2933 *
2934 * struct {
2935 * ECParameters curve_params;
2936 * ECPoint public;
2937 * } ServerECDHParams;
2938 */
Valerio Setti18c9fed2022-12-30 17:44:24 +01002939 uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
Gilles Peskine449bd832023-01-11 14:50:10 +01002940 const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
Janos Follath865b3eb2019-12-16 11:46:15 +00002941 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002942 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002943
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002944 /* Match our preference list against the offered curves */
Gilles Peskine449bd832023-01-11 14:50:10 +01002945 if ((group_list == NULL) || (curr_tls_id == NULL)) {
2946 return MBEDTLS_ERR_SSL_BAD_CONFIG;
2947 }
2948 for (; *group_list != 0; group_list++) {
2949 for (curr_tls_id = ssl->handshake->curves_tls_id;
2950 *curr_tls_id != 0; curr_tls_id++) {
2951 if (*curr_tls_id == *group_list) {
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002952 goto curve_matching_done;
Gilles Peskine449bd832023-01-11 14:50:10 +01002953 }
2954 }
Gergely Budai987bfb52014-01-19 21:48:42 +01002955 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002956
Gilles Peskine449bd832023-01-11 14:50:10 +01002957curve_matching_done:
2958 if (*curr_tls_id == 0) {
2959 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2960 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2961 }
2962
2963 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2964 mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
Gergely Budai987bfb52014-01-19 21:48:42 +01002965
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002966#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrongd91526c2022-04-12 14:38:52 +02002967 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2968 psa_key_attributes_t key_attributes;
2969 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002970 uint8_t *p = ssl->out_msg + ssl->out_msglen;
2971 const size_t header_size = 4; // curve_type(1), namedcurve(2),
2972 // data length(1)
2973 const size_t data_length_size = 1;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002974 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01002975 size_t ec_bits = 0;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002976
Gilles Peskine449bd832023-01-11 14:50:10 +01002977 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrongd91526c2022-04-12 14:38:52 +02002978
Valerio Setti40d9ca92023-01-04 16:08:04 +01002979 /* Convert EC's TLS ID to PSA key type. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002980 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
Przemek Stekielda4fba62023-06-02 14:52:28 +02002981 &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01002982 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
2983 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
2984 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielb6ce0b62022-03-09 15:38:24 +01002985 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002986 handshake->xxdh_psa_type = key_type;
2987 handshake->xxdh_bits = ec_bits;
Neil Armstrongd91526c2022-04-12 14:38:52 +02002988
2989 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002990 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2991 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002992 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
2993 psa_set_key_bits(&key_attributes, handshake->xxdh_bits);
Neil Armstrongd91526c2022-04-12 14:38:52 +02002994
2995 /*
2996 * ECParameters curve_params
2997 *
2998 * First byte is curve_type, always named_curve
2999 */
3000 *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
3001
3002 /*
3003 * Next two bytes are the namedcurve value
3004 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003005 MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
Neil Armstrongd91526c2022-04-12 14:38:52 +02003006 p += 2;
3007
3008 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003009 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003010 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003011 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003012 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003013 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
3014 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003015 }
3016
3017 /*
3018 * ECPoint public
3019 *
3020 * First byte is data length.
3021 * It will be filled later. p holds now the data length location.
3022 */
3023
3024 /* Export the public part of the ECDH private key from PSA.
3025 * Make one byte space for the length.
3026 */
3027 unsigned char *own_pubkey = p + data_length_size;
3028
Gilles Peskine449bd832023-01-11 14:50:10 +01003029 size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
3030 - (own_pubkey - ssl->out_msg));
Neil Armstrongd91526c2022-04-12 14:38:52 +02003031
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003032 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01003033 own_pubkey, own_pubkey_max_len,
3034 &len);
3035 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003036 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003037 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003038 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3039 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003040 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003041 }
3042
3043 /* Store the length of the exported public key. */
3044 *p = (uint8_t) len;
3045
3046 /* Determine full message length. */
3047 len += header_size;
3048#else
Valerio Setti18c9fed2022-12-30 17:44:24 +01003049 mbedtls_ecp_group_id curr_grp_id =
Gilles Peskine449bd832023-01-11 14:50:10 +01003050 mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
Valerio Setti18c9fed2022-12-30 17:44:24 +01003051
Gilles Peskine449bd832023-01-11 14:50:10 +01003052 if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
3053 curr_grp_id)) != 0) {
3054 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
3055 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003056 }
3057
Gilles Peskine449bd832023-01-11 14:50:10 +01003058 if ((ret = mbedtls_ecdh_make_params(
3059 &ssl->handshake->ecdh_ctx, &len,
3060 ssl->out_msg + ssl->out_msglen,
3061 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
3062 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3063 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
3064 return ret;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003065 }
3066
Gilles Peskine449bd832023-01-11 14:50:10 +01003067 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3068 MBEDTLS_DEBUG_ECDH_Q);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003069#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker41c83d32013-03-20 14:39:14 +01003070
Jerry Yuc5aef882021-12-23 20:15:02 +08003071#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003072 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003073#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003074
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003075 ssl->out_msglen += len;
Paul Bakker41c83d32013-03-20 14:39:14 +01003076 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003077#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003078
Hanno Becker1aa267c2017-04-28 17:08:27 +01003079 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003080 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003081 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003082 * exchange parameters, compute and add the signature here.
3083 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003084 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003085#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003086 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3087 if (dig_signed == NULL) {
3088 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3089 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Elliott11420382022-05-13 17:43:47 +01003090 }
3091
Gilles Peskine1004c192018-01-08 16:59:14 +01003092 size_t dig_signed_len = ssl->out_msg + ssl->out_msglen - dig_signed;
Gilles Peskineca1d7422018-04-24 11:53:22 +02003093 size_t hashlen = 0;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02003094 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel51669542022-09-13 12:57:05 +02003095
Janos Follath865b3eb2019-12-16 11:46:15 +00003096 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003097
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003098 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003099 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02003100 * For TLS 1.2, obey signature-hash-algorithm extension
3101 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003102 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003103
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003104 mbedtls_pk_type_t sig_alg =
Gilles Peskine449bd832023-01-11 14:50:10 +01003105 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Ronald Cron8457c122022-03-07 11:32:54 +01003106
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003107 unsigned int sig_hash =
3108 mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
Gilles Peskine449bd832023-01-11 14:50:10 +01003109 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003110
Gilles Peskine449bd832023-01-11 14:50:10 +01003111 mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
Gabor Mezeia3d016c2022-05-10 12:44:09 +02003112
Ronald Cron8457c122022-03-07 11:32:54 +01003113 /* For TLS 1.2, obey signature-hash-algorithm extension
3114 * (RFC 5246, Sec. 7.4.1.4.1). */
Gilles Peskine449bd832023-01-11 14:50:10 +01003115 if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3116 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ronald Cron8457c122022-03-07 11:32:54 +01003117 /* (... because we choose a cipher suite
3118 * only if there is a matching hash.) */
Gilles Peskine449bd832023-01-11 14:50:10 +01003119 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003120 }
3121
Gilles Peskine449bd832023-01-11 14:50:10 +01003122 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003123
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003124 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003125 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003126 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003127 if (md_alg != MBEDTLS_MD_NONE) {
3128 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3129 dig_signed,
3130 dig_signed_len,
3131 md_alg);
3132 if (ret != 0) {
3133 return ret;
3134 }
3135 } else {
3136 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3137 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003138 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003139
Gilles Peskine449bd832023-01-11 14:50:10 +01003140 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003141
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003142 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003143 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003144 */
Ronald Cron8457c122022-03-07 11:32:54 +01003145 /*
3146 * We need to specify signature and hash algorithm explicitly through
3147 * a prefix to the signature.
3148 *
3149 * struct {
3150 * HashAlgorithm hash;
3151 * SignatureAlgorithm signature;
3152 * } SignatureAndHashAlgorithm;
3153 *
3154 * struct {
3155 * SignatureAndHashAlgorithm algorithm;
3156 * opaque signature<0..2^16-1>;
3157 * } DigitallySigned;
3158 *
3159 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003160
Gilles Peskine449bd832023-01-11 14:50:10 +01003161 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3162 ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003163
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003164#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003165 if (ssl->conf->f_async_sign_start != NULL) {
3166 ret = ssl->conf->f_async_sign_start(ssl,
3167 mbedtls_ssl_own_cert(ssl),
3168 md_alg, hash, hashlen);
3169 switch (ret) {
3170 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3171 /* act as if f_async_sign was null */
3172 break;
3173 case 0:
3174 ssl->handshake->async_in_progress = 1;
3175 return ssl_resume_server_key_exchange(ssl, signature_len);
3176 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3177 ssl->handshake->async_in_progress = 1;
3178 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3179 default:
3180 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3181 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003182 }
3183 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003184#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003185
Gilles Peskine449bd832023-01-11 14:50:10 +01003186 if (mbedtls_ssl_own_key(ssl) == NULL) {
3187 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3188 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003189 }
3190
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003191 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3192 * signature length which will be added in ssl_write_server_key_exchange
3193 * after the call to ssl_prepare_server_key_exchange.
3194 * ssl_write_server_key_exchange also takes care of incrementing
3195 * ssl->out_msglen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003196 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3197 md_alg, hash, hashlen,
3198 ssl->out_msg + ssl->out_msglen + 2,
3199 out_buf_len - ssl->out_msglen - 2,
3200 signature_len,
3201 ssl->conf->f_rng,
3202 ssl->conf->p_rng)) != 0) {
3203 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3204 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003205 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003206 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003207#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003208
Gilles Peskine449bd832023-01-11 14:50:10 +01003209 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003210}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003211
Gilles Peskined3eb0612018-01-08 17:07:44 +01003212/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003213 * that do not include a ServerKeyExchange message, do nothing. Either
3214 * way, if successful, move on to the next step in the SSL state
3215 * machine. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003216MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003217static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003218{
Janos Follath865b3eb2019-12-16 11:46:15 +00003219 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003220 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003221#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003222 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Gilles Peskine449bd832023-01-11 14:50:10 +01003223 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003224#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003225
Gilles Peskine449bd832023-01-11 14:50:10 +01003226 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003227
Gilles Peskineeccd8882020-03-10 12:19:08 +01003228#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003229 /* Extract static ECDH parameters and abort if ServerKeyExchange
3230 * is not needed. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003231 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003232 /* For suites involving ECDH, extract DH parameters
3233 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003234#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003235 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3236 ret = ssl_get_ecdh_params_from_cert(ssl);
3237 if (ret != 0) {
3238 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3239 return ret;
Manuel Pégourié-Gonnardb64fb622022-06-10 09:34:20 +02003240 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003241 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003242#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003243
3244 /* Key exchanges not involving ephemeral keys don't use
3245 * ServerKeyExchange, so end here. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003246 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003247 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003248 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003249 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003250#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003251
Gilles Peskineeccd8882020-03-10 12:19:08 +01003252#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003253 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003254 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003255 * signature operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003256 if (ssl->handshake->async_in_progress != 0) {
3257 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3258 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3259 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003260#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003261 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003262 {
3263 /* ServerKeyExchange is needed. Prepare the message. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003264 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003265 }
3266
Gilles Peskine449bd832023-01-11 14:50:10 +01003267 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003268 /* If we're starting to write a new message, set ssl->out_msglen
3269 * to 0. But if we're resuming after an asynchronous message,
3270 * out_msglen is the amount of data written so far and mst be
3271 * preserved. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003272 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3273 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3274 } else {
Gilles Peskined3eb0612018-01-08 17:07:44 +01003275 ssl->out_msglen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003276 }
3277 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003278 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003279
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003280 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003281 * ssl_prepare_server_key_exchange already wrote the signature
3282 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003283#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003284 if (signature_len != 0) {
3285 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3286 ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003287
Gilles Peskine449bd832023-01-11 14:50:10 +01003288 MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3289 ssl->out_msg + ssl->out_msglen,
3290 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003291
3292 /* Skip over the already-written signature */
3293 ssl->out_msglen += signature_len;
3294 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003295#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003296
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003297 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003298 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3299 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003300
3301 ssl->state++;
3302
Gilles Peskine449bd832023-01-11 14:50:10 +01003303 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3304 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3305 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003306 }
3307
Gilles Peskine449bd832023-01-11 14:50:10 +01003308 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3309 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003310}
3311
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003312MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003313static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003314{
Janos Follath865b3eb2019-12-16 11:46:15 +00003315 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003316
Gilles Peskine449bd832023-01-11 14:50:10 +01003317 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003318
3319 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003320 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3321 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003322
3323 ssl->state++;
3324
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003325#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003326 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3327 mbedtls_ssl_send_flight_completed(ssl);
3328 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003329#endif
3330
Gilles Peskine449bd832023-01-11 14:50:10 +01003331 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3332 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3333 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003334 }
3335
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003336#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003337 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3338 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3339 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3340 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003341 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003342#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003343
Gilles Peskine449bd832023-01-11 14:50:10 +01003344 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003345
Gilles Peskine449bd832023-01-11 14:50:10 +01003346 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003347}
3348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003349#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3350 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003351MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003352static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3353 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003354{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003355 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003356 size_t n;
3357
3358 /*
3359 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3360 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003361 if (*p + 2 > end) {
3362 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3363 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003364 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003365
Gilles Peskine449bd832023-01-11 14:50:10 +01003366 n = ((*p)[0] << 8) | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003367 *p += 2;
3368
Gilles Peskine449bd832023-01-11 14:50:10 +01003369 if (*p + n > end) {
3370 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3371 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003372 }
3373
Gilles Peskine449bd832023-01-11 14:50:10 +01003374 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3375 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3376 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003377 }
3378
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003379 *p += n;
3380
Gilles Peskine449bd832023-01-11 14:50:10 +01003381 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003382
Gilles Peskine449bd832023-01-11 14:50:10 +01003383 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003384}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003385#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3386 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003387
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003388#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3389 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003390
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003391#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003392MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003393static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3394 unsigned char *peer_pms,
3395 size_t *peer_pmslen,
3396 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003397{
Gilles Peskine449bd832023-01-11 14:50:10 +01003398 int ret = ssl->conf->f_async_resume(ssl,
3399 peer_pms, peer_pmslen, peer_pmssize);
3400 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003401 ssl->handshake->async_in_progress = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003402 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003403 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003404 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3405 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003406}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003407#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003408
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003409MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003410static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3411 const unsigned char *p,
3412 const unsigned char *end,
3413 unsigned char *peer_pms,
3414 size_t *peer_pmslen,
3415 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003416{
Janos Follath865b3eb2019-12-16 11:46:15 +00003417 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003418
Gilles Peskine449bd832023-01-11 14:50:10 +01003419 mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3420 if (own_cert == NULL) {
3421 MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3422 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Leonid Rozenboim70dfd4c2022-08-08 15:43:44 -07003423 }
3424 mbedtls_pk_context *public_key = &own_cert->pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003425 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3426 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003427
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003428#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003429 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003430 * decryption operation, resume signing. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003431 if (ssl->handshake->async_in_progress != 0) {
3432 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3433 return ssl_resume_decrypt_pms(ssl,
3434 peer_pms, peer_pmslen, peer_pmssize);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003435 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003436#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003437
3438 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003439 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003440 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003441 if (p + 2 > end) {
3442 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3443 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003444 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003445 if (*p++ != MBEDTLS_BYTE_1(len) ||
3446 *p++ != MBEDTLS_BYTE_0(len)) {
3447 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3448 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003449 }
3450
Gilles Peskine449bd832023-01-11 14:50:10 +01003451 if (p + len != end) {
3452 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3453 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003454 }
3455
Gilles Peskine422ccab2018-01-11 18:29:01 +01003456 /*
3457 * Decrypt the premaster secret
3458 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003459#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003460 if (ssl->conf->f_async_decrypt_start != NULL) {
3461 ret = ssl->conf->f_async_decrypt_start(ssl,
3462 mbedtls_ssl_own_cert(ssl),
3463 p, len);
3464 switch (ret) {
3465 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3466 /* act as if f_async_decrypt_start was null */
3467 break;
3468 case 0:
3469 ssl->handshake->async_in_progress = 1;
3470 return ssl_resume_decrypt_pms(ssl,
3471 peer_pms,
3472 peer_pmslen,
3473 peer_pmssize);
3474 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3475 ssl->handshake->async_in_progress = 1;
3476 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3477 default:
3478 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3479 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003480 }
3481 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003482#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003483
Gilles Peskine449bd832023-01-11 14:50:10 +01003484 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3485 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3486 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003487 }
3488
Gilles Peskine449bd832023-01-11 14:50:10 +01003489 ret = mbedtls_pk_decrypt(private_key, p, len,
3490 peer_pms, peer_pmslen, peer_pmssize,
3491 ssl->conf->f_rng, ssl->conf->p_rng);
3492 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003493}
3494
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003495MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003496static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3497 const unsigned char *p,
3498 const unsigned char *end,
3499 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003500{
Janos Follath865b3eb2019-12-16 11:46:15 +00003501 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003502 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3503 unsigned char ver[2];
3504 unsigned char fake_pms[48], peer_pms[48];
3505 unsigned char mask;
3506 size_t i, peer_pmslen;
3507 unsigned int diff;
3508
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003509 /* In case of a failure in decryption, the decryption may write less than
3510 * 2 bytes of output, but we always read the first two bytes. It doesn't
3511 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003512 * ret being nonzero, and we only care whether diff is 0.
3513 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3514 * also makes memory analyzers happy (don't access uninitialized memory,
3515 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003516 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003517 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003518
Gilles Peskine449bd832023-01-11 14:50:10 +01003519 ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3520 peer_pms,
3521 &peer_pmslen,
3522 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003523
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003524#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003525 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3526 return ret;
3527 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003528#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003529
Gilles Peskine449bd832023-01-11 14:50:10 +01003530 mbedtls_ssl_write_version(ver, ssl->conf->transport,
3531 ssl->session_negotiate->tls_version);
Gilles Peskine2e333372018-04-24 13:22:10 +02003532
3533 /* Avoid data-dependent branches while checking for invalid
3534 * padding, to protect against timing-based Bleichenbacher-type
3535 * attacks. */
3536 diff = (unsigned int) ret;
3537 diff |= peer_pmslen ^ 48;
3538 diff |= peer_pms[0] ^ ver[0];
3539 diff |= peer_pms[1] ^ ver[1];
3540
3541 /* mask = diff ? 0xff : 0x00 using bit operations to avoid branches */
Gilles Peskine449bd832023-01-11 14:50:10 +01003542 mask = mbedtls_ct_uint_mask(diff);
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003543
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003544 /*
3545 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3546 * must not cause the connection to end immediately; instead, send a
3547 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003548 * To protect against timing-based variants of the attack, we must
3549 * not have any branch that depends on whether the decryption was
3550 * successful. In particular, always generate the fake premaster secret,
3551 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003552 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003553 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3554 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003555 /* It's ok to abort on an RNG failure, since this does not reveal
3556 * anything about the RSA decryption. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003557 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003558 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003559
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003560#if defined(MBEDTLS_SSL_DEBUG_ALL)
Gilles Peskine449bd832023-01-11 14:50:10 +01003561 if (diff != 0) {
3562 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3563 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003564#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003565
Gilles Peskine449bd832023-01-11 14:50:10 +01003566 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3567 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3568 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3569 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003570 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003571 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003572
Gilles Peskine422ccab2018-01-11 18:29:01 +01003573 /* Set pms to either the true or the fake PMS, without
3574 * data-dependent branches. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003575 for (i = 0; i < ssl->handshake->pmslen; i++) {
3576 pms[i] = (mask & fake_pms[i]) | ((~mask) & peer_pms[i]);
3577 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003578
Gilles Peskine449bd832023-01-11 14:50:10 +01003579 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003580}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003581#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
3582 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003583
Gilles Peskineeccd8882020-03-10 12:19:08 +01003584#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003585MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003586static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3587 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003588{
Paul Bakker6db455e2013-09-18 17:29:31 +02003589 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003590 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003591
Gilles Peskine449bd832023-01-11 14:50:10 +01003592 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3593 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3594 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003595 }
3596
3597 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003598 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003599 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003600 if (end - *p < 2) {
3601 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3602 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003603 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003604
Gilles Peskine449bd832023-01-11 14:50:10 +01003605 n = ((*p)[0] << 8) | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003606 *p += 2;
3607
Gilles Peskine449bd832023-01-11 14:50:10 +01003608 if (n == 0 || n > end - *p) {
3609 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3610 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003611 }
3612
Gilles Peskine449bd832023-01-11 14:50:10 +01003613 if (ssl->conf->f_psk != NULL) {
3614 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003615 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Gilles Peskine449bd832023-01-11 14:50:10 +01003616 }
3617 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003618 /* Identity is not a big secret since clients send it in the clear,
3619 * but treat it carefully anyway, just in case */
Gilles Peskine449bd832023-01-11 14:50:10 +01003620 if (n != ssl->conf->psk_identity_len ||
3621 mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003622 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003623 }
3624 }
3625
Gilles Peskine449bd832023-01-11 14:50:10 +01003626 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3627 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3628 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3629 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3630 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003631 }
3632
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003633 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003634
Gilles Peskine449bd832023-01-11 14:50:10 +01003635 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003636}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003637#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003638
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003639MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003640static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003641{
Janos Follath865b3eb2019-12-16 11:46:15 +00003642 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003643 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003644 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003645
Hanno Beckere694c3e2017-12-27 21:34:08 +00003646 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003647
Gilles Peskine449bd832023-01-11 14:50:10 +01003648 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003649
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003650#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskine449bd832023-01-11 14:50:10 +01003651 (defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3652 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED))
3653 if ((ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3654 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) &&
3655 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003656 /* We've already read a record and there is an asynchronous
3657 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003658 * record. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003659 MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3660 } else
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003661#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003662 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3663 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3664 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003665 }
3666
Gilles Peskine449bd832023-01-11 14:50:10 +01003667 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003668 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003669
Gilles Peskine449bd832023-01-11 14:50:10 +01003670 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3671 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3672 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003673 }
3674
Gilles Peskine449bd832023-01-11 14:50:10 +01003675 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3676 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3677 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003678 }
3679
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003680#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003681 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3682 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3683 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3684 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003685 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003686
Gilles Peskine449bd832023-01-11 14:50:10 +01003687 if (p != end) {
3688 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3689 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003690 }
3691
Gilles Peskine449bd832023-01-11 14:50:10 +01003692 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3693 ssl->handshake->premaster,
3694 MBEDTLS_PREMASTER_SIZE,
3695 &ssl->handshake->pmslen,
3696 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3697 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3698 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003699 }
3700
Gilles Peskine449bd832023-01-11 14:50:10 +01003701 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3702 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003703#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003704#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3705 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3706 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3707 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003708 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Neil Armstrong1f4b3962022-03-09 14:54:29 +01003709 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3710 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01003711 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003712#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003713 size_t data_len = (size_t) (*p++);
3714 size_t buf_len = (size_t) (end - p);
Przemek Stekielce1d7922022-03-14 16:16:25 +01003715 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3716 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3717
Gilles Peskine449bd832023-01-11 14:50:10 +01003718 MBEDTLS_SSL_DEBUG_MSG(1, ("Read the peer's public key."));
Przemek Stekielce1d7922022-03-14 16:16:25 +01003719
3720 /*
Przemek Stekiel338b61d2022-03-15 08:03:43 +01003721 * We must have at least two bytes (1 for length, at least 1 for data)
3722 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003723 if (buf_len < 2) {
3724 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length"));
3725 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003726 }
3727
Gilles Peskine449bd832023-01-11 14:50:10 +01003728 if (data_len < 1 || data_len > buf_len) {
3729 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length"));
3730 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003731 }
3732
3733 /* Store peer's ECDH public key. */
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003734 memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3735 handshake->xxdh_psa_peerkey_len = data_len;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003736
3737 /* Compute ECDH shared secret. */
3738 status = psa_raw_key_agreement(
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003739 PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3740 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003741 handshake->premaster, sizeof(handshake->premaster),
3742 &handshake->pmslen);
3743 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003744 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003745 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003746 if (handshake->xxdh_psa_privkey_is_external == 0) {
3747 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01003748 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003749 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003750 return ret;
Przemek Stekielce1d7922022-03-14 16:16:25 +01003751 }
3752
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003753 if (handshake->xxdh_psa_privkey_is_external == 0) {
3754 status = psa_destroy_key(handshake->xxdh_psa_privkey);
Neil Armstrong8113d252022-03-23 10:57:04 +01003755
Gilles Peskine449bd832023-01-11 14:50:10 +01003756 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003757 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003758 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3759 return ret;
Neil Armstrong8113d252022-03-23 10:57:04 +01003760 }
Przemek Stekielce1d7922022-03-14 16:16:25 +01003761 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003762 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrongd91526c2022-04-12 14:38:52 +02003763#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003764 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
3765 p, end - p)) != 0) {
3766 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3767 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003768 }
3769
Gilles Peskine449bd832023-01-11 14:50:10 +01003770 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3771 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003772
Gilles Peskine449bd832023-01-11 14:50:10 +01003773 if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
3774 &ssl->handshake->pmslen,
3775 ssl->handshake->premaster,
3776 MBEDTLS_MPI_MAX_SIZE,
3777 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3778 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3779 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003780 }
3781
Gilles Peskine449bd832023-01-11 14:50:10 +01003782 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3783 MBEDTLS_DEBUG_ECDH_Z);
Neil Armstrong913b3642022-04-13 14:59:48 +02003784#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003785 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003786#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3787 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3788 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3789 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3790#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003791 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3792 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3793 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3794 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003795 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003796
Gilles Peskine449bd832023-01-11 14:50:10 +01003797 if (p != end) {
3798 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3799 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003800 }
3801
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003802#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003803 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3804 ciphersuite_info->key_exchange)) != 0) {
3805 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3806 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003807 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003808#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003809 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003810#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
3811#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003812 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003813#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01003814 if (ssl->handshake->async_in_progress != 0) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003815 /* There is an asynchronous operation in progress to
3816 * decrypt the encrypted premaster secret, so skip
3817 * directly to resuming this operation. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003818 MBEDTLS_SSL_DEBUG_MSG(3, ("PSK identity already parsed"));
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003819 /* Update p to skip the PSK identity. ssl_parse_encrypted_pms
3820 * won't actually use it, but maintain p anyway for robustness. */
3821 p += ssl->conf->psk_identity_len + 2;
Gilles Peskine449bd832023-01-11 14:50:10 +01003822 } else
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003823#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01003824 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3825 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3826 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003827 }
3828
Gilles Peskine449bd832023-01-11 14:50:10 +01003829 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 2)) != 0) {
3830 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_encrypted_pms"), ret);
3831 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003832 }
3833
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003834#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003835 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3836 ciphersuite_info->key_exchange)) != 0) {
3837 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3838 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003839 }
Neil Armstrongcd05f0b2022-05-03 10:28:37 +02003840#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003841 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003842#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3843#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003844 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3845 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3846 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3847 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003848 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003849 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3850 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3851 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003852 }
3853
Gilles Peskine449bd832023-01-11 14:50:10 +01003854 if (p != end) {
3855 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3856 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003857 }
3858
Neil Armstrong80f6f322022-05-03 17:56:38 +02003859#if defined(MBEDTLS_USE_PSA_CRYPTO)
3860 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003861 unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003862 size_t pms_len;
3863
3864 /* Write length only when we know the actual value */
Gilles Peskine449bd832023-01-11 14:50:10 +01003865 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3866 pms + 2, pms_end - (pms + 2), &pms_len,
3867 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3868 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3869 return ret;
Neil Armstrong80f6f322022-05-03 17:56:38 +02003870 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003871 MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003872 pms += 2 + pms_len;
3873
Gilles Peskine449bd832023-01-11 14:50:10 +01003874 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003875#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003876 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3877 ciphersuite_info->key_exchange)) != 0) {
3878 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3879 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003880 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003881#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003882 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003883#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd91526c2022-04-12 14:38:52 +02003884#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003885 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong913b3642022-04-13 14:59:48 +02003886#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrong039db292022-03-09 11:38:34 +01003887 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3888 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
3889 uint8_t ecpoint_len;
3890
3891 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3892
Gilles Peskine449bd832023-01-11 14:50:10 +01003893 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3894 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003895 psa_destroy_key(handshake->xxdh_psa_privkey);
3896 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003897 return ret;
Neil Armstrong039db292022-03-09 11:38:34 +01003898 }
3899
3900 /* Keep a copy of the peer's public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01003901 if (p >= end) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003902 psa_destroy_key(handshake->xxdh_psa_privkey);
3903 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003904 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong3cae1672022-04-05 10:01:15 +02003905 }
3906
Neil Armstrong039db292022-03-09 11:38:34 +01003907 ecpoint_len = *(p++);
Gilles Peskine449bd832023-01-11 14:50:10 +01003908 if ((size_t) (end - p) < ecpoint_len) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003909 psa_destroy_key(handshake->xxdh_psa_privkey);
3910 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01003911 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Neil Armstrong039db292022-03-09 11:38:34 +01003912 }
3913
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003914 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3915 the sizes of the FFDH keys which are at least 2048 bits.
3916 The size of the array is thus greater than 256 bytes which is greater than any
3917 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003918#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003919 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3920 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_HANDSHAKE_FAILURE;
Neil Armstrong039db292022-03-09 11:38:34 +01003923 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02003924#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02003925 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3926 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02003927#endif
Neil Armstrong039db292022-03-09 11:38:34 +01003928
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003929 memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3930 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Neil Armstrong039db292022-03-09 11:38:34 +01003931 p += ecpoint_len;
3932
Neil Armstrong3bcef082022-03-23 18:16:54 +01003933 /* As RFC 5489 section 2, the premaster secret is formed as follows:
Neil Armstrongfdf20cb2022-03-24 09:43:02 +01003934 * - a uint16 containing the length (in octets) of the ECDH computation
3935 * - the octet string produced by the ECDH computation
3936 * - a uint16 containing the length (in octets) of the PSK
3937 * - the PSK itself
3938 */
Neil Armstrong039db292022-03-09 11:38:34 +01003939 unsigned char *psm = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003940 const unsigned char * const psm_end =
3941 psm + sizeof(ssl->handshake->premaster);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003942 /* uint16 to store length (in octets) of the ECDH computation */
3943 const size_t zlen_size = 2;
Neil Armstrong549a3e42022-03-23 18:16:24 +01003944 size_t zlen = 0;
Neil Armstrong039db292022-03-09 11:38:34 +01003945
3946 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003947 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003948 handshake->xxdh_psa_privkey,
3949 handshake->xxdh_psa_peerkey,
3950 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003951 psm + zlen_size,
3952 psm_end - (psm + zlen_size),
3953 &zlen);
Neil Armstrong039db292022-03-09 11:38:34 +01003954
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003955 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3956 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong039db292022-03-09 11:38:34 +01003957
Gilles Peskine449bd832023-01-11 14:50:10 +01003958 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003959 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003960 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003961 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003962 }
Neil Armstrong039db292022-03-09 11:38:34 +01003963
Neil Armstrong3bcef082022-03-23 18:16:54 +01003964 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003965 MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
Neil Armstrong2d63da92022-03-23 18:17:31 +01003966 psm += zlen_size + zlen;
Neil Armstrong039db292022-03-09 11:38:34 +01003967
Przemek Stekiel14d11b02022-04-14 08:33:29 +02003968#else /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003969 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3970 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3971 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003972 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003973
Gilles Peskine449bd832023-01-11 14:50:10 +01003974 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
3975 p, end - p)) != 0) {
3976 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3977 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003978 }
3979
Gilles Peskine449bd832023-01-11 14:50:10 +01003980 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3981 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003982
Gilles Peskine449bd832023-01-11 14:50:10 +01003983 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3984 ciphersuite_info->key_exchange)) != 0) {
3985 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3986 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003987 }
Neil Armstrong913b3642022-04-13 14:59:48 +02003988#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003989 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003990#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
3991#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003992 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
3993 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
3994 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
3995 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003996 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003997 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003998#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003999#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01004000 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Neil Armstrongca7d5062022-05-31 14:43:23 +02004001#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01004002 if ((ret = mbedtls_psa_ecjpake_read_round(
4003 &ssl->handshake->psa_pake_ctx, p, end - p,
4004 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
4005 psa_destroy_key(ssl->handshake->psa_pake_password);
4006 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02004007
Gilles Peskine449bd832023-01-11 14:50:10 +01004008 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
4009 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02004010 }
4011#else
Gilles Peskine449bd832023-01-11 14:50:10 +01004012 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
4013 p, end - p);
4014 if (ret != 0) {
4015 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
4016 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004017 }
4018
Gilles Peskine449bd832023-01-11 14:50:10 +01004019 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
4020 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
4021 ssl->conf->f_rng, ssl->conf->p_rng);
4022 if (ret != 0) {
4023 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
4024 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004025 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02004026#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01004027 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004028#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004029 {
Gilles Peskine449bd832023-01-11 14:50:10 +01004030 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4031 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004032 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004033
Gilles Peskine449bd832023-01-11 14:50:10 +01004034 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
4035 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
4036 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00004037 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004038
Paul Bakker5121ce52009-01-03 21:22:43 +00004039 ssl->state++;
4040
Gilles Peskine449bd832023-01-11 14:50:10 +01004041 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004042
Gilles Peskine449bd832023-01-11 14:50:10 +01004043 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00004044}
4045
Gilles Peskineeccd8882020-03-10 12:19:08 +01004046#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004047MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004048static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004049{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004050 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004051 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00004052
Gilles Peskine449bd832023-01-11 14:50:10 +01004053 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004054
Gilles Peskine449bd832023-01-11 14:50:10 +01004055 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4056 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02004057 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004058 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02004059 }
4060
Gilles Peskine449bd832023-01-11 14:50:10 +01004061 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4062 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004063}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004064#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004065MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004066static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004067{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004068 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004069 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004070 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004071 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004072 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004073 mbedtls_pk_type_t pk_alg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004074 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004075 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004076 ssl->handshake->ciphersuite_info;
Gilles Peskine449bd832023-01-11 14:50:10 +01004077 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004078
Gilles Peskine449bd832023-01-11 14:50:10 +01004079 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004080
Gilles Peskine449bd832023-01-11 14:50:10 +01004081 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4082 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004083 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004084 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004085 }
4086
Hanno Becker2a831a42019-02-07 13:17:25 +00004087#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Gilles Peskine449bd832023-01-11 14:50:10 +01004088 if (ssl->session_negotiate->peer_cert == NULL) {
4089 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004090 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004091 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004092 }
4093#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004094 if (ssl->session_negotiate->peer_cert_digest == NULL) {
4095 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00004096 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01004097 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00004098 }
4099#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4100
Simon Butcher99000142016-10-13 17:21:01 +01004101 /* Read the message without adding it to the checksum */
Gilles Peskine449bd832023-01-11 14:50:10 +01004102 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
4103 if (0 != ret) {
4104 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
4105 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004106 }
4107
4108 ssl->state++;
4109
Simon Butcher99000142016-10-13 17:21:01 +01004110 /* Process the message contents */
Gilles Peskine449bd832023-01-11 14:50:10 +01004111 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4112 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
4113 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4114 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00004115 }
4116
Gilles Peskine449bd832023-01-11 14:50:10 +01004117 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004118
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004119#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4120 peer_pk = &ssl->handshake->peer_pubkey;
4121#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01004122 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004123 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01004124 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004125 }
4126 peer_pk = &ssl->session_negotiate->peer_cert->pk;
4127#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4128
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004129 /*
4130 * struct {
4131 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4132 * opaque signature<0..2^16-1>;
4133 * } DigitallySigned;
4134 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004135 if (i + 2 > ssl->in_hslen) {
4136 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4137 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ronald Cron8457c122022-03-07 11:32:54 +01004138 }
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004139
Ronald Cron8457c122022-03-07 11:32:54 +01004140 /*
4141 * Hash
4142 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004143 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01004144
Gilles Peskine449bd832023-01-11 14:50:10 +01004145 if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
4146 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4147 " for verify message"));
4148 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004149 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004150
Simon Butcher99000142016-10-13 17:21:01 +01004151#if !defined(MBEDTLS_MD_SHA1)
Gilles Peskine449bd832023-01-11 14:50:10 +01004152 if (MBEDTLS_MD_SHA1 == md_alg) {
Ronald Cron8457c122022-03-07 11:32:54 +01004153 hash_start += 16;
Gilles Peskine449bd832023-01-11 14:50:10 +01004154 }
Simon Butcher99000142016-10-13 17:21:01 +01004155#endif
Paul Bakker926af752012-11-23 13:38:07 +01004156
Ronald Cron8457c122022-03-07 11:32:54 +01004157 /* Info from md_alg will be used instead */
4158 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004159
Ronald Cron8457c122022-03-07 11:32:54 +01004160 i++;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004161
Ronald Cron8457c122022-03-07 11:32:54 +01004162 /*
4163 * Signature
4164 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004165 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
4166 == MBEDTLS_PK_NONE) {
4167 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4168 " for verify message"));
4169 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004170 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004171
Ronald Cron8457c122022-03-07 11:32:54 +01004172 /*
4173 * Check the certificate's key type matches the signature alg
4174 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004175 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
4176 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
4177 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ronald Cron8457c122022-03-07 11:32:54 +01004178 }
4179
4180 i++;
4181
Gilles Peskine449bd832023-01-11 14:50:10 +01004182 if (i + 2 > ssl->in_hslen) {
4183 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4184 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004185 }
4186
Gilles Peskine449bd832023-01-11 14:50:10 +01004187 sig_len = (ssl->in_msg[i] << 8) | ssl->in_msg[i+1];
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004188 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004189
Gilles Peskine449bd832023-01-11 14:50:10 +01004190 if (i + sig_len != ssl->in_hslen) {
4191 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4192 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00004193 }
4194
Simon Butcher99000142016-10-13 17:21:01 +01004195 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004196 {
4197 size_t dummy_hlen;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004198 ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
4199 if (0 != ret) {
4200 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
4201 return ret;
4202 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004203 }
Simon Butcher99000142016-10-13 17:21:01 +01004204
Gilles Peskine449bd832023-01-11 14:50:10 +01004205 if ((ret = mbedtls_pk_verify(peer_pk,
4206 md_alg, hash_start, hashlen,
4207 ssl->in_msg + i, sig_len)) != 0) {
4208 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
4209 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004210 }
4211
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01004212 ret = mbedtls_ssl_update_handshake_status(ssl);
4213 if (0 != ret) {
4214 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
4215 return ret;
4216 }
Simon Butcher99000142016-10-13 17:21:01 +01004217
Gilles Peskine449bd832023-01-11 14:50:10 +01004218 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004219
Gilles Peskine449bd832023-01-11 14:50:10 +01004220 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004221}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004222#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004223
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004224#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004225MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01004226static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004227{
Janos Follath865b3eb2019-12-16 11:46:15 +00004228 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004229 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004230 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004231
Gilles Peskine449bd832023-01-11 14:50:10 +01004232 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004233
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004234 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4235 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004236
4237 /*
4238 * struct {
4239 * uint32 ticket_lifetime_hint;
4240 * opaque ticket<0..2^16-1>;
4241 * } NewSessionTicket;
4242 *
4243 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4244 * 8 . 9 ticket_len (n)
4245 * 10 . 9+n ticket content
4246 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004247
Gilles Peskine449bd832023-01-11 14:50:10 +01004248 if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4249 ssl->session_negotiate,
4250 ssl->out_msg + 10,
4251 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4252 &tlen, &lifetime)) != 0) {
4253 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004254 tlen = 0;
4255 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004256
Gilles Peskine449bd832023-01-11 14:50:10 +01004257 MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4258 MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004259 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004260
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004261 /*
4262 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4263 * ChangeCipherSpec share the same state.
4264 */
4265 ssl->handshake->new_session_ticket = 0;
4266
Gilles Peskine449bd832023-01-11 14:50:10 +01004267 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4268 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4269 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004270 }
4271
Gilles Peskine449bd832023-01-11 14:50:10 +01004272 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004273
Gilles Peskine449bd832023-01-11 14:50:10 +01004274 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004275}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004276#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004277
Paul Bakker5121ce52009-01-03 21:22:43 +00004278/*
Paul Bakker1961b702013-01-25 14:49:24 +01004279 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004280 */
Gilles Peskine449bd832023-01-11 14:50:10 +01004281int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004282{
4283 int ret = 0;
4284
Gilles Peskine449bd832023-01-11 14:50:10 +01004285 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004286
Gilles Peskine449bd832023-01-11 14:50:10 +01004287 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004288 case MBEDTLS_SSL_HELLO_REQUEST:
4289 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004290 break;
4291
Paul Bakker1961b702013-01-25 14:49:24 +01004292 /*
4293 * <== ClientHello
4294 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004295 case MBEDTLS_SSL_CLIENT_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004296 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004297 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004298
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004299#if defined(MBEDTLS_SSL_PROTO_DTLS)
4300 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Gilles Peskine449bd832023-01-11 14:50:10 +01004301 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004302#endif
4303
Paul Bakker1961b702013-01-25 14:49:24 +01004304 /*
4305 * ==> ServerHello
4306 * Certificate
4307 * ( ServerKeyExchange )
4308 * ( CertificateRequest )
4309 * ServerHelloDone
4310 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004311 case MBEDTLS_SSL_SERVER_HELLO:
Gilles Peskine449bd832023-01-11 14:50:10 +01004312 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004313 break;
4314
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004315 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004316 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004317 break;
4318
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004319 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004320 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004321 break;
4322
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004323 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Gilles Peskine449bd832023-01-11 14:50:10 +01004324 ret = ssl_write_certificate_request(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_HELLO_DONE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004328 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004329 break;
4330
4331 /*
4332 * <== ( Certificate/Alert )
4333 * ClientKeyExchange
4334 * ( CertificateVerify )
4335 * ChangeCipherSpec
4336 * Finished
4337 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004338 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004339 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004340 break;
4341
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004342 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Gilles Peskine449bd832023-01-11 14:50:10 +01004343 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004344 break;
4345
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004346 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Gilles Peskine449bd832023-01-11 14:50:10 +01004347 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004348 break;
4349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004350 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Gilles Peskine449bd832023-01-11 14:50:10 +01004351 ret = mbedtls_ssl_parse_change_cipher_spec(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_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004355 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004356 break;
4357
4358 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004359 * ==> ( NewSessionTicket )
4360 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004361 * Finished
4362 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004363 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4364#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01004365 if (ssl->handshake->new_session_ticket != 0) {
4366 ret = ssl_write_new_session_ticket(ssl);
4367 } else
Paul Bakkera503a632013-08-14 13:48:06 +02004368#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01004369 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004370 break;
4371
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004372 case MBEDTLS_SSL_SERVER_FINISHED:
Gilles Peskine449bd832023-01-11 14:50:10 +01004373 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004374 break;
4375
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004376 case MBEDTLS_SSL_FLUSH_BUFFERS:
Gilles Peskine449bd832023-01-11 14:50:10 +01004377 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004378 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004379 break;
4380
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004381 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Gilles Peskine449bd832023-01-11 14:50:10 +01004382 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004383 break;
4384
4385 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01004386 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4387 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004388 }
4389
Gilles Peskine449bd832023-01-11 14:50:10 +01004390 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004391}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004392
Gilles Peskine449bd832023-01-11 14:50:10 +01004393void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004394{
TRodziewicz3946f792021-06-14 12:11:18 +02004395 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004396}
4397
Jerry Yufb4b6472022-01-27 15:03:26 +08004398#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */