blob: 4e3dc8e001698b3895f7df13960502684fac2e13 [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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020022#if defined(MBEDTLS_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000023
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020024# if defined(MBEDTLS_PLATFORM_C)
25# include "mbedtls/platform.h"
26# else
27# include <stdlib.h>
28# define mbedtls_calloc calloc
29# define mbedtls_free free
30# endif
SimonBd5800b72016-04-26 07:43:27 +010031
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020032# include "mbedtls/ssl.h"
33# include "ssl_misc.h"
34# include "mbedtls/debug.h"
35# include "mbedtls/error.h"
36# include "mbedtls/platform_util.h"
Rich Evans00ab4702015-02-06 13:43:58 +000037
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020038# include <string.h>
Rich Evans00ab4702015-02-06 13:43:58 +000039
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020040# if defined(MBEDTLS_ECP_C)
41# include "mbedtls/ecp.h"
42# endif
Paul Bakker5121ce52009-01-03 21:22:43 +000043
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020044# if defined(MBEDTLS_HAVE_TIME)
45# include "mbedtls/platform_time.h"
46# endif
Paul Bakker5121ce52009-01-03 21:22:43 +000047
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020048# if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
49int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl,
50 const unsigned char *info,
51 size_t ilen)
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020052{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020053 if (ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER)
54 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020055
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020056 mbedtls_free(ssl->cli_id);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020057
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020058 if ((ssl->cli_id = mbedtls_calloc(1, ilen)) == NULL)
59 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020060
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020061 memcpy(ssl->cli_id, info, ilen);
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020062 ssl->cli_id_len = ilen;
63
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020064 return 0;
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020065}
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020066
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020067void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf,
68 mbedtls_ssl_cookie_write_t *f_cookie_write,
69 mbedtls_ssl_cookie_check_t *f_cookie_check,
70 void *p_cookie)
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020071{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +020072 conf->f_cookie_write = f_cookie_write;
73 conf->f_cookie_check = f_cookie_check;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020074 conf->p_cookie = p_cookie;
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020075}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020076# endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020077
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020078# if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
79static int ssl_parse_servername_ext(mbedtls_ssl_context *ssl,
80 const unsigned char *buf,
81 size_t len)
Paul Bakker5701cdc2012-09-27 21:49:42 +000082{
Janos Follath865b3eb2019-12-16 11:46:15 +000083 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5701cdc2012-09-27 21:49:42 +000084 size_t servername_list_size, hostname_len;
Paul Bakker23f36802012-09-28 14:15:14 +000085 const unsigned char *p;
Paul Bakker5701cdc2012-09-27 21:49:42 +000086
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020087 MBEDTLS_SSL_DEBUG_MSG(3, ("parse ServerName extension"));
Manuel Pégourié-Gonnard96ea2f22014-02-25 12:26:29 +010088
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020089 if (len < 2) {
90 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
91 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
92 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
93 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +020094 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020095 servername_list_size = ((buf[0] << 8) | (buf[1]));
96 if (servername_list_size + 2 != len) {
97 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
98 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
99 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
100 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5701cdc2012-09-27 21:49:42 +0000101 }
102
103 p = buf + 2;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200104 while (servername_list_size > 2) {
105 hostname_len = ((p[1] << 8) | p[2]);
106 if (hostname_len + 3 > servername_list_size) {
107 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
108 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
109 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
110 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5701cdc2012-09-27 21:49:42 +0000111 }
112
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200113 if (p[0] == MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME) {
114 ret = ssl->conf->f_sni(ssl->conf->p_sni, ssl, p + 3, hostname_len);
115 if (ret != 0) {
116 MBEDTLS_SSL_DEBUG_RET(1, "ssl_sni_wrapper", ret);
117 mbedtls_ssl_send_alert_message(
118 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
119 MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME);
120 return MBEDTLS_ERR_SSL_UNRECOGNIZED_NAME;
Paul Bakker5701cdc2012-09-27 21:49:42 +0000121 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200122 return 0;
Paul Bakker5701cdc2012-09-27 21:49:42 +0000123 }
124
125 servername_list_size -= hostname_len + 3;
Paul Bakker23f36802012-09-28 14:15:14 +0000126 p += hostname_len + 3;
127 }
128
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200129 if (servername_list_size != 0) {
130 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
131 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
132 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
133 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5701cdc2012-09-27 21:49:42 +0000134 }
135
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200136 return 0;
Paul Bakker5701cdc2012-09-27 21:49:42 +0000137}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200138# endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +0000139
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200140# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
141static int ssl_conf_has_psk_or_cb(mbedtls_ssl_config const *conf)
Hanno Becker845b9462018-10-26 12:07:29 +0100142{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200143 if (conf->f_psk != NULL)
144 return 1;
Hanno Becker845b9462018-10-26 12:07:29 +0100145
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200146 if (conf->psk_identity_len == 0 || conf->psk_identity == NULL)
147 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +0100148
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200149 if (conf->psk != NULL && conf->psk_len != 0)
150 return 1;
Hanno Becker845b9462018-10-26 12:07:29 +0100151
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200152# if defined(MBEDTLS_USE_PSA_CRYPTO)
153 if (!mbedtls_svc_key_id_is_null(conf->psk_opaque))
154 return 1;
155# endif /* MBEDTLS_USE_PSA_CRYPTO */
Hanno Becker845b9462018-10-26 12:07:29 +0100156
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200157 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +0100158}
159
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200160# if defined(MBEDTLS_USE_PSA_CRYPTO)
161static int ssl_use_opaque_psk(mbedtls_ssl_context const *ssl)
Hanno Becker845b9462018-10-26 12:07:29 +0100162{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200163 if (ssl->conf->f_psk != NULL) {
Hanno Becker845b9462018-10-26 12:07:29 +0100164 /* If we've used a callback to select the PSK,
165 * the static configuration is irrelevant. */
166
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200167 if (!mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque))
168 return 1;
Hanno Becker845b9462018-10-26 12:07:29 +0100169
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200170 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +0100171 }
172
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200173 if (!mbedtls_svc_key_id_is_null(ssl->conf->psk_opaque))
174 return 1;
Hanno Becker845b9462018-10-26 12:07:29 +0100175
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200176 return 0;
Hanno Becker845b9462018-10-26 12:07:29 +0100177}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200178# endif /* MBEDTLS_USE_PSA_CRYPTO */
179# endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker845b9462018-10-26 12:07:29 +0100180
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200181static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl,
182 const unsigned char *buf,
183 size_t len)
Paul Bakker48916f92012-09-16 19:57:18 +0000184{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200185# if defined(MBEDTLS_SSL_RENEGOTIATION)
186 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100187 /* Check verify-data in constant-time. The length OTOH is no secret */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200188 if (len != 1 + ssl->verify_data_len || buf[0] != ssl->verify_data_len ||
189 mbedtls_ssl_safer_memcmp(buf + 1, ssl->peer_verify_data,
190 ssl->verify_data_len) != 0) {
191 MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info"));
192 mbedtls_ssl_send_alert_message(
193 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
194 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
195 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100196 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200197 } else
198# endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +0000199 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200200 if (len != 1 || buf[0] != 0x0) {
201 MBEDTLS_SSL_DEBUG_MSG(1, ("non-zero length renegotiation info"));
202 mbedtls_ssl_send_alert_message(
203 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
204 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
205 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +0000206 }
207
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200208 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +0000209 }
Paul Bakker48916f92012-09-16 19:57:18 +0000210
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200211 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +0000212}
213
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200214# if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
215 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100216
217/*
218 * Status of the implementation of signature-algorithms extension:
219 *
220 * Currently, we are only considering the signature-algorithm extension
221 * to pick a ciphersuite which allows us to send the ServerKeyExchange
222 * message with a signature-hash combination that the user allows.
223 *
224 * We do *not* check whether all certificates in our certificate
225 * chain are signed with an allowed signature-hash pair.
226 * This needs to be done at a later stage.
227 *
228 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200229static int ssl_parse_signature_algorithms_ext(mbedtls_ssl_context *ssl,
230 const unsigned char *buf,
231 size_t len)
Paul Bakker23f36802012-09-28 14:15:14 +0000232{
233 size_t sig_alg_list_size;
Hanno Becker7e5437a2017-04-28 17:15:26 +0100234
Paul Bakker23f36802012-09-28 14:15:14 +0000235 const unsigned char *p;
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200236 const unsigned char *end = buf + len;
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200237
Hanno Becker7e5437a2017-04-28 17:15:26 +0100238 mbedtls_md_type_t md_cur;
239 mbedtls_pk_type_t sig_cur;
Paul Bakker23f36802012-09-28 14:15:14 +0000240
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200241 if (len < 2) {
242 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
243 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
244 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
245 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +0200246 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200247 sig_alg_list_size = ((buf[0] << 8) | (buf[1]));
248 if (sig_alg_list_size + 2 != len || sig_alg_list_size % 2 != 0) {
249 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
250 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
251 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
252 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker23f36802012-09-28 14:15:14 +0000253 }
254
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200255 /* Currently we only guarantee signing the ServerKeyExchange message
256 * according to the constraints specified in this extension (see above), so
257 * it suffices to remember only one suitable hash for each possible
258 * signature algorithm.
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200259 *
Hanno Becker7e5437a2017-04-28 17:15:26 +0100260 * This will change when we also consider certificate signatures,
261 * in which case we will need to remember the whole signature-hash
262 * pair list from the extension.
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200263 */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100264
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200265 for (p = buf + 2; p < end; p += 2) {
Hanno Becker7e5437a2017-04-28 17:15:26 +0100266 /* Silently ignore unknown signature or hash algorithms. */
267
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200268 if ((sig_cur = mbedtls_ssl_pk_alg_from_sig(p[1])) == MBEDTLS_PK_NONE) {
269 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext"
270 " unknown sig alg encoding %d",
271 p[1]));
Hanno Becker7e5437a2017-04-28 17:15:26 +0100272 continue;
273 }
274
275 /* Check if we support the hash the user proposes */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200276 md_cur = mbedtls_ssl_md_alg_from_hash(p[0]);
277 if (md_cur == MBEDTLS_MD_NONE) {
278 MBEDTLS_SSL_DEBUG_MSG(3,
279 ("client hello v3, signature_algorithm ext:"
280 " unknown hash alg encoding %d",
281 p[0]));
Hanno Becker7e5437a2017-04-28 17:15:26 +0100282 continue;
283 }
284
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200285 if (mbedtls_ssl_check_sig_hash(ssl, md_cur) == 0) {
286 mbedtls_ssl_sig_hash_set_add(&ssl->handshake->hash_algs, sig_cur,
287 md_cur);
288 MBEDTLS_SSL_DEBUG_MSG(3,
289 ("client hello v3, signature_algorithm ext:"
290 " match sig %u and hash %u",
291 (unsigned)sig_cur, (unsigned)md_cur));
292 } else {
293 MBEDTLS_SSL_DEBUG_MSG(3,
294 ("client hello v3, signature_algorithm ext: "
295 "hash alg %u not supported",
296 (unsigned)md_cur));
Paul Bakker23f36802012-09-28 14:15:14 +0000297 }
Paul Bakker23f36802012-09-28 14:15:14 +0000298 }
299
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200300 return 0;
Paul Bakker23f36802012-09-28 14:15:14 +0000301}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200302# endif /* MBEDTLS_SSL_PROTO_TLS1_2 && \
303 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker23f36802012-09-28 14:15:14 +0000304
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200305# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
306 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
307static int ssl_parse_supported_elliptic_curves(mbedtls_ssl_context *ssl,
308 const unsigned char *buf,
309 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100310{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200311 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100312 const unsigned char *p;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200313 const mbedtls_ecp_curve_info *curve_info, **curves;
Paul Bakker41c83d32013-03-20 14:39:14 +0100314
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200315 if (len < 2) {
316 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
317 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
318 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
319 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +0200320 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200321 list_size = ((buf[0] << 8) | (buf[1]));
322 if (list_size + 2 != len || list_size % 2 != 0) {
323 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
324 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
325 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
326 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100327 }
328
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200329 /* Should never happen unless client duplicates the extension */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200330 if (ssl->handshake->curves != NULL) {
331 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
332 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
333 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
334 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200335 }
336
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100337 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200338 * and leave room for a final 0 */
339 our_size = list_size / 2 + 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200340 if (our_size > MBEDTLS_ECP_DP_MAX)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200341 our_size = MBEDTLS_ECP_DP_MAX;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200342
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200343 if ((curves = mbedtls_calloc(our_size, sizeof(*curves))) == NULL) {
344 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
345 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
346 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200347 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200348
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200349 ssl->handshake->curves = curves;
350
Paul Bakker41c83d32013-03-20 14:39:14 +0100351 p = buf + 2;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200352 while (list_size > 0 && our_size > 1) {
353 curve_info = mbedtls_ecp_curve_info_from_tls_id((p[0] << 8) | p[1]);
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200354
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200355 if (curve_info != NULL) {
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200356 *curves++ = curve_info;
357 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100358 }
359
360 list_size -= 2;
361 p += 2;
362 }
363
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200364 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100365}
366
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200367static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl,
368 const unsigned char *buf,
369 size_t len)
Paul Bakker41c83d32013-03-20 14:39:14 +0100370{
371 size_t list_size;
372 const unsigned char *p;
373
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200374 if (len == 0 || (size_t)(buf[0] + 1) != len) {
375 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
376 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
377 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
378 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +0100379 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200380 list_size = buf[0];
Paul Bakker41c83d32013-03-20 14:39:14 +0100381
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200382 p = buf + 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200383 while (list_size > 0) {
384 if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
385 p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
386# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200387 ssl->handshake->ecdh_ctx.point_format = p[0];
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200388# endif
389# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
390 mbedtls_ecjpake_set_point_format(&ssl->handshake->ecjpake_ctx,
391 p[0]);
392# endif
393 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
394 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100395 }
396
397 list_size--;
398 p++;
399 }
400
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200401 return 0;
Paul Bakker41c83d32013-03-20 14:39:14 +0100402}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200403# endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || \
404 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100405
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200406# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
407static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
408 const unsigned char *buf,
409 size_t len)
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200410{
Janos Follath865b3eb2019-12-16 11:46:15 +0000411 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200412
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200413 if (mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0) {
414 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
415 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200416 }
417
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200418 if ((ret = mbedtls_ecjpake_read_round_one(&ssl->handshake->ecjpake_ctx, buf,
419 len)) != 0) {
420 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_one", ret);
421 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
422 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
423 return ret;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200424 }
425
426 /* Only mark the extension as OK when we're sure it is */
427 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
428
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200429 return 0;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200430}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200431# endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200432
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200433# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
434static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
435 const unsigned char *buf,
436 size_t len)
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200437{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200438 if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
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_ILLEGAL_PARAMETER);
442 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200443 }
444
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200445 ssl->session_negotiate->mfl_code = buf[0];
446
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200447 return 0;
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200448}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200449# endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200450
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200451# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
452static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
453 const unsigned char *buf,
454 size_t len)
Hanno Becker89dcc882019-04-26 13:56:39 +0100455{
456 size_t peer_cid_len;
457
458 /* CID extension only makes sense in DTLS */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200459 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
460 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
461 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
462 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
463 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100464 }
465
466 /*
Hanno Beckerebcc9132019-05-15 10:26:32 +0100467 * Quoting draft-ietf-tls-dtls-connection-id-05
468 * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
Hanno Becker89dcc882019-04-26 13:56:39 +0100469 *
470 * struct {
471 * opaque cid<0..2^8-1>;
472 * } ConnectionId;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200473 */
Hanno Becker89dcc882019-04-26 13:56:39 +0100474
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200475 if (len < 1) {
476 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
477 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
478 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
479 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100480 }
481
482 peer_cid_len = *buf++;
483 len--;
484
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200485 if (len != peer_cid_len) {
486 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
487 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
488 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
489 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Becker89dcc882019-04-26 13:56:39 +0100490 }
491
492 /* Ignore CID if the user has disabled its use. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200493 if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
Hanno Becker89dcc882019-04-26 13:56:39 +0100494 /* Leave ssl->handshake->cid_in_use in its default
495 * value of MBEDTLS_SSL_CID_DISABLED. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200496 MBEDTLS_SSL_DEBUG_MSG(3,
497 ("Client sent CID extension, but CID disabled"));
498 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100499 }
500
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200501 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
502 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
503 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
504 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
505 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Becker89dcc882019-04-26 13:56:39 +0100506 }
507
Hanno Becker08556bf2019-05-03 12:43:44 +0100508 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200509 ssl->handshake->peer_cid_len = (uint8_t)peer_cid_len;
510 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100511
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200512 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
513 MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
Hanno Becker89dcc882019-04-26 13:56:39 +0100514
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200515 return 0;
Hanno Becker89dcc882019-04-26 13:56:39 +0100516}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200517# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100518
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200519# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
520static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
521 const unsigned char *buf,
522 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100523{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200524 if (len != 0) {
525 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
526 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
527 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
528 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100529 }
530
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200531 ((void)buf);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100532
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200533 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200534 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100535 }
536
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200537 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100538}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200539# endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100540
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200541# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
542static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
543 const unsigned char *buf,
544 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200545{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200546 if (len != 0) {
547 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
548 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
549 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
550 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200551 }
552
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200553 ((void)buf);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200554
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200555 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200556 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200557 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200558
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200559 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200560}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200561# endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200562
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200563# if defined(MBEDTLS_SSL_SESSION_TICKETS)
564static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
565 unsigned char *buf,
566 size_t len)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200567{
Janos Follath865b3eb2019-12-16 11:46:15 +0000568 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200569 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200570
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200571 mbedtls_ssl_session_init(&session);
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200572
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200573 if (ssl->conf->f_ticket_parse == NULL ||
574 ssl->conf->f_ticket_write == NULL) {
575 return 0;
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200576 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200577
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200578 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200579 ssl->handshake->new_session_ticket = 1;
580
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200581 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200582
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200583 if (len == 0)
584 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200585
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200586# if defined(MBEDTLS_SSL_RENEGOTIATION)
587 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
588 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
589 return 0;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200590 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200591# endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200592
593 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200594 * Failures are ok: just ignore the ticket and proceed.
595 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200596 if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session, buf,
597 len)) != 0) {
598 mbedtls_ssl_session_free(&session);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200599
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200600 if (ret == MBEDTLS_ERR_SSL_INVALID_MAC)
601 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
602 else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED)
603 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200604 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200605 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200606
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200607 return 0;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200608 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200609
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200610 /*
611 * Keep the session ID sent by the client, since we MUST send it back to
612 * inform them we're accepting the ticket (RFC 5077 section 3.4)
613 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200614 session.id_len = ssl->session_negotiate->id_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200615 memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200616
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200617 mbedtls_ssl_session_free(ssl->session_negotiate);
618 memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200619
620 /* Zeroize instead of free as we copied the content */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200621 mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200622
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200623 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200624
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200625 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200626
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200627 /* Don't send a new ticket after all, this one is OK */
628 ssl->handshake->new_session_ticket = 0;
629
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200630 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200631}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200632# endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200633
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200634# if defined(MBEDTLS_SSL_ALPN)
635static int ssl_parse_alpn_ext(mbedtls_ssl_context *ssl,
636 const unsigned char *buf,
637 size_t len)
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200638{
Paul Bakker14b16c62014-05-28 11:33:54 +0200639 size_t list_len, cur_len, ours_len;
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200640 const unsigned char *theirs, *start, *end;
641 const char **ours;
642
643 /* If ALPN not configured, just ignore the extension */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200644 if (ssl->conf->alpn_list == NULL)
645 return 0;
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200646
647 /*
648 * opaque ProtocolName<1..2^8-1>;
649 *
650 * struct {
651 * ProtocolName protocol_name_list<2..2^16-1>
652 * } ProtocolNameList;
653 */
654
655 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200656 if (len < 4) {
657 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
658 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
659 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200660 }
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200661
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200662 list_len = (buf[0] << 8) | buf[1];
663 if (list_len != len - 2) {
664 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
665 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
666 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200667 }
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200668
669 /*
Manuel Pégourié-Gonnard239987f2018-01-09 10:43:43 +0100670 * Validate peer's list (lengths)
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200671 */
672 start = buf + 2;
673 end = buf + len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200674 for (theirs = start; theirs != end; theirs += cur_len) {
Manuel Pégourié-Gonnard239987f2018-01-09 10:43:43 +0100675 cur_len = *theirs++;
676
677 /* Current identifier must fit in list */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200678 if (cur_len > (size_t)(end - theirs)) {
679 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
680 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
681 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard239987f2018-01-09 10:43:43 +0100682 }
683
684 /* Empty strings MUST NOT be included */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200685 if (cur_len == 0) {
686 mbedtls_ssl_send_alert_message(
687 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
688 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
689 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard239987f2018-01-09 10:43:43 +0100690 }
691 }
692
693 /*
694 * Use our order of preference
695 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200696 for (ours = ssl->conf->alpn_list; *ours != NULL; ours++) {
697 ours_len = strlen(*ours);
698 for (theirs = start; theirs != end; theirs += cur_len) {
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200699 cur_len = *theirs++;
700
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200701 if (cur_len == ours_len && memcmp(theirs, *ours, cur_len) == 0) {
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200702 ssl->alpn_chosen = *ours;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200703 return 0;
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200704 }
705 }
706 }
707
708 /* If we get there, no match was found */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200709 mbedtls_ssl_send_alert_message(
710 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
711 MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL);
712 return MBEDTLS_ERR_SSL_NO_APPLICATION_PROTOCOL;
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200713}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200714# endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200715
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200716# if defined(MBEDTLS_SSL_DTLS_SRTP)
717static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
718 const unsigned char *buf,
719 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100720{
Johan Pascal43f94902020-09-22 12:25:52 +0200721 mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200722 size_t i, j;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200723 size_t profile_length;
724 uint16_t mki_length;
Ron Eldor313d7b52018-12-10 14:56:21 +0200725 /*! 2 bytes for profile length and 1 byte for mki len */
726 const size_t size_of_lengths = 3;
Johan Pascalb62bb512015-12-03 21:56:45 +0100727
728 /* If use_srtp is not configured, just ignore the extension */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200729 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
730 (ssl->conf->dtls_srtp_profile_list == NULL) ||
731 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
732 return 0;
Johan Pascal85269572020-08-25 10:01:54 +0200733 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100734
735 /* RFC5764 section 4.1.1
736 * uint8 SRTPProtectionProfile[2];
737 *
738 * struct {
739 * SRTPProtectionProfiles SRTPProtectionProfiles;
740 * opaque srtp_mki<0..255>;
741 * } UseSRTPData;
742
743 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100744 */
745
Ron Eldoref72faf2018-07-12 11:54:20 +0300746 /*
747 * Min length is 5: at least one protection profile(2 bytes)
748 * and length(2 bytes) + srtp_mki length(1 byte)
Johan Pascal042d4562020-08-25 12:14:02 +0200749 * Check here that we have at least 2 bytes of protection profiles length
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200750 * and one of srtp_mki length
Ron Eldoref72faf2018-07-12 11:54:20 +0300751 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200752 if (len < size_of_lengths) {
753 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
754 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
755 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200756 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100757
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200758 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200759
Ron Eldoref72faf2018-07-12 11:54:20 +0300760 /* first 2 bytes are protection profile length(in bytes) */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200761 profile_length = (buf[0] << 8) | buf[1];
Johan Pascal042d4562020-08-25 12:14:02 +0200762 buf += 2;
Ron Eldor591f1622018-01-22 12:30:04 +0200763
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200764 /* The profile length cannot be bigger than input buffer size - lengths
765 * fields */
766 if (profile_length > len - size_of_lengths ||
767 profile_length % 2 != 0) /* profiles are 2 bytes long, so the length
768 must be even */
Ron Eldor313d7b52018-12-10 14:56:21 +0200769 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200770 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
771 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
772 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Ron Eldor313d7b52018-12-10 14:56:21 +0200773 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300774 /*
775 * parse the extension list values are defined in
776 * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
777 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200778 for (j = 0; j < profile_length; j += 2) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200779 uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200780 client_protection =
781 mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
Johan Pascalb62bb512015-12-03 21:56:45 +0100782
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200783 if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
784 MBEDTLS_SSL_DEBUG_MSG(
785 3, ("found srtp profile: %s",
786 mbedtls_ssl_get_srtp_profile_as_string(client_protection)));
787 } else {
Johan Pascal85269572020-08-25 10:01:54 +0200788 continue;
789 }
Ron Eldor591f1622018-01-22 12:30:04 +0200790 /* check if suggested profile is in our list */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200791 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
792 if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
793 ssl->dtls_srtp_info.chosen_dtls_srtp_profile =
794 ssl->conf->dtls_srtp_profile_list[i];
795 MBEDTLS_SSL_DEBUG_MSG(3,
796 ("selected srtp profile: %s",
797 mbedtls_ssl_get_srtp_profile_as_string(
798 client_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +0200799 break;
Johan Pascalb62bb512015-12-03 21:56:45 +0100800 }
801 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200802 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile !=
803 MBEDTLS_TLS_SRTP_UNSET)
Ron Eldor591f1622018-01-22 12:30:04 +0200804 break;
805 }
Johan Pascal042d4562020-08-25 12:14:02 +0200806 buf += profile_length; /* buf points to the mki length */
807 mki_length = *buf;
808 buf++;
Ron Eldor591f1622018-01-22 12:30:04 +0200809
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200810 if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
811 mki_length + profile_length + size_of_lengths != len) {
812 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
813 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
814 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Johan Pascal042d4562020-08-25 12:14:02 +0200815 }
816
817 /* Parse the mki only if present and mki is supported locally */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200818 if (ssl->conf->dtls_srtp_mki_support ==
819 MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
820 mki_length > 0) {
Johan Pascal042d4562020-08-25 12:14:02 +0200821 ssl->dtls_srtp_info.mki_len = mki_length;
822
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200823 memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
Ron Eldorb4655392018-07-05 18:25:39 +0300824
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200825 MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value,
826 ssl->dtls_srtp_info.mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100827 }
828
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200829 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100830}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200831# endif /* MBEDTLS_SSL_DTLS_SRTP */
Johan Pascalb62bb512015-12-03 21:56:45 +0100832
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100833/*
834 * Auxiliary functions for ServerHello parsing and related actions
835 */
836
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200837# if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100838/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100839 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100840 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200841# if defined(MBEDTLS_ECDSA_C)
842static int ssl_check_key_curve(mbedtls_pk_context *pk,
843 const mbedtls_ecp_curve_info **curves)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100844{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200845 const mbedtls_ecp_curve_info **crv = curves;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200846 mbedtls_ecp_group_id grp_id = mbedtls_pk_ec(*pk)->grp.id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100847
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200848 while (*crv != NULL) {
849 if ((*crv)->grp_id == grp_id)
850 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100851 crv++;
852 }
853
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200854 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100855}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200856# endif /* MBEDTLS_ECDSA_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100857
858/*
859 * Try picking a certificate for this ciphersuite,
860 * return 0 on success and -1 on failure.
861 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200862static int ssl_pick_cert(mbedtls_ssl_context *ssl,
863 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100864{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200865 mbedtls_ssl_key_cert *cur, *list, *fallback = NULL;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100866 mbedtls_pk_type_t pk_alg =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200867 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200868 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100869
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200870# if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
871 if (ssl->handshake->sni_key_cert != NULL)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100872 list = ssl->handshake->sni_key_cert;
873 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200874# endif
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200875 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100876
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200877 if (pk_alg == MBEDTLS_PK_NONE)
878 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100879
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200880 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000881
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200882 if (list == NULL) {
883 MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
884 return -1;
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200885 }
886
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200887 for (cur = list; cur != NULL; cur = cur->next) {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400888 flags = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200889 MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
890 cur->cert);
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000891
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200892 if (!mbedtls_pk_can_do(&cur->cert->pk, pk_alg)) {
893 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100894 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000895 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100896
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200897 /*
898 * This avoids sending the client a cert it'll reject based on
899 * keyUsage or other extensions.
900 *
901 * It also allows the user to provision different certificates for
902 * different uses based on keyUsage, eg if they want to avoid signing
903 * and decrypting with the same RSA key.
904 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200905 if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
906 MBEDTLS_SSL_IS_SERVER, &flags) != 0) {
907 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
908 "(extended) key usage extension"));
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200909 continue;
910 }
911
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200912# if defined(MBEDTLS_ECDSA_C)
913 if (pk_alg == MBEDTLS_PK_ECDSA &&
914 ssl_check_key_curve(&cur->cert->pk, ssl->handshake->curves) != 0) {
915 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100916 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000917 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200918# endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100919
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100920 /*
921 * Try to select a SHA-1 certificate for pre-1.2 clients, but still
922 * present them a SHA-higher cert rather than failing if it's the only
923 * one we got that satisfies the other conditions.
924 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200925 if (ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 &&
926 cur->cert->sig_md != MBEDTLS_MD_SHA1) {
927 if (fallback == NULL)
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100928 fallback = cur;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000929 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200930 MBEDTLS_SSL_DEBUG_MSG(3, ("certificate not preferred: "
931 "sha-2 with pre-TLS 1.2 client"));
932 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000933 }
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100934 }
935
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100936 /* If we get there, we got a winner */
937 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100938 }
939
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200940 if (cur == NULL)
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000941 cur = fallback;
942
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200943 /* Do not update ssl->handshake->key_cert unless there is a match */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200944 if (cur != NULL) {
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100945 ssl->handshake->key_cert = cur;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200946 MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
947 ssl->handshake->key_cert->cert);
948 return 0;
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100949 }
950
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200951 return -1;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100952}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200953# endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100954
955/*
956 * Check if a given ciphersuite is suitable for use with our config/keys/etc
957 * Sets ciphersuite_info only if the suite matches.
958 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200959static int
960ssl_ciphersuite_match(mbedtls_ssl_context *ssl,
961 int suite_id,
962 const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100963{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200964 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100965
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200966# if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
967 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100968 mbedtls_pk_type_t sig_type;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200969# endif
Hanno Becker7e5437a2017-04-28 17:15:26 +0100970
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200971 suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
972 if (suite_info == NULL) {
973 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
974 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100975 }
976
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200977 MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
978 (unsigned int)suite_id, suite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000979
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200980 if (suite_info->min_minor_ver > ssl->minor_ver ||
981 suite_info->max_minor_ver < ssl->minor_ver) {
982 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
983 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000984 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100985
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200986# if defined(MBEDTLS_SSL_PROTO_DTLS)
987 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
988 (suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS))
989 return 0;
990# endif
Manuel Pégourié-Gonnardd6664512014-02-06 13:26:57 +0100991
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200992# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
993 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
994 (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
995 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
996 "not configured or ext missing"));
997 return 0;
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200998 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200999# endif
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +02001000
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001001# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
1002 if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
1003 (ssl->handshake->curves == NULL || ssl->handshake->curves[0] == NULL)) {
1004 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
1005 "no common elliptic curve"));
1006 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001007 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001008# endif
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +01001009
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001010# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +01001011 /* If the ciphersuite requires a pre-shared key and we don't
1012 * have one, skip it now rather than failing later */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001013 if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
1014 ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
1015 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
1016 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001017 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001018# endif
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +01001019
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001020# if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1021 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001022 /* If the ciphersuite requires signing, check whether
1023 * a suitable hash algorithm is present. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001024 if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) {
1025 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
1026 if (sig_type != MBEDTLS_PK_NONE &&
1027 mbedtls_ssl_sig_hash_set_find(&ssl->handshake->hash_algs,
1028 sig_type) == MBEDTLS_MD_NONE) {
1029 MBEDTLS_SSL_DEBUG_MSG(
1030 3, ("ciphersuite mismatch: no suitable hash algorithm "
1031 "for signature algorithm %u",
1032 (unsigned)sig_type));
1033 return 0;
Hanno Becker7e5437a2017-04-28 17:15:26 +01001034 }
1035 }
1036
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001037# endif /* MBEDTLS_SSL_PROTO_TLS1_2 && \
1038 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001039
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001040# if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +01001041 /*
1042 * Final check: if ciphersuite requires us to have a
1043 * certificate/key of a particular type:
1044 * - select the appropriate certificate if we have one, or
1045 * - try the next ciphersuite if we don't
1046 * This must be done last since we modify the key_cert list.
1047 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001048 if (ssl_pick_cert(ssl, suite_info) != 0) {
1049 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
1050 "no suitable certificate"));
1051 return 0;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001052 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001053# endif
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +01001054
1055 *ciphersuite_info = suite_info;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001056 return 0;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +01001057}
1058
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001059/* This function doesn't alert on errors that happen early during
1060 ClientHello parsing because they might indicate that the client is
1061 not talking SSL/TLS at all and would not understand our alert. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001062static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00001063{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001064 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +02001065 size_t i, j;
1066 size_t ciph_offset, comp_offset, ext_offset;
1067 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001068# if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +02001069 size_t cookie_offset, cookie_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001070# endif
Paul Bakker48916f92012-09-16 19:57:18 +00001071 unsigned char *buf, *p, *ext;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001072# if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001073 int renegotiation_info_seen = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001074# endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001075 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001076 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001077 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01001078 int major, minor;
Paul Bakker5121ce52009-01-03 21:22:43 +00001079
Hanno Becker7e5437a2017-04-28 17:15:26 +01001080 /* If there is no signature-algorithm extension present,
1081 * we need to fall back to the default values for allowed
1082 * signature-hash pairs. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001083# if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1084 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001085 int sig_hash_alg_ext_present = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001086# endif /* MBEDTLS_SSL_PROTO_TLS1_2 && \
1087 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001088
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001089 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001090
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001091# if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001092read_record_header:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001093# endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001094 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001095 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001096 * otherwise read it ourselves manually in order to support SSLv2
1097 * ClientHello, which doesn't use the same record layer format.
1098 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001099# if defined(MBEDTLS_SSL_RENEGOTIATION)
1100 if (ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE)
1101# endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001102 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001103 if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001104 /* No alert on a read error. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001105 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
1106 return ret;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +00001107 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001108 }
1109
1110 buf = ssl->in_hdr;
1111
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001112 MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
Paul Bakkerec636f32012-09-09 19:17:02 +00001113
Paul Bakkerec636f32012-09-09 19:17:02 +00001114 /*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01001115 * TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +00001116 *
1117 * Record layer:
1118 * 0 . 0 message type
1119 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001120 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +00001121 * 3 . 4 message length
1122 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001123 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d", buf[0]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001124
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001125 if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
1126 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1127 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01001128 }
1129
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001130 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
1131 (ssl->in_len[0] << 8) | ssl->in_len[1]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001132
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001133 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]", buf[1],
1134 buf[2]));
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001135
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001136 mbedtls_ssl_read_version(&major, &minor, ssl->conf->transport, buf + 1);
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001137
1138 /* According to RFC 5246 Appendix E.1, the version here is typically
1139 * "{03,00}, the lowest version number supported by the client, [or] the
1140 * value of ClientHello.client_version", so the only meaningful check here
1141 * is the major version shouldn't be less than 3 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001142 if (major < MBEDTLS_SSL_MAJOR_VERSION_3) {
1143 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1144 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakkerec636f32012-09-09 19:17:02 +00001145 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001146
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001147 /* For DTLS if this is the initial handshake, remember the client sequence
1148 * number to use it in our next message (RFC 6347 4.2.1) */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001149# if defined(MBEDTLS_SSL_PROTO_DTLS)
1150 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
1151# if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001152 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001153# endif
1154 ) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001155 /* Epoch should be 0 for initial handshakes */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001156 if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
1157 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1158 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001159 }
1160
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001161 memcpy(ssl->cur_out_ctr + 2, ssl->in_ctr + 2, 6);
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001162
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001163# if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
1164 if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
1165 MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001166 ssl->next_record_offset = 0;
1167 ssl->in_left = 0;
1168 goto read_record_header;
1169 }
1170
1171 /* No MAC to check yet, so we can update right now */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001172 mbedtls_ssl_dtls_replay_update(ssl);
1173# endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001174 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001175# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001176
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001177 msg_len = (ssl->in_len[0] << 8) | ssl->in_len[1];
Paul Bakker5121ce52009-01-03 21:22:43 +00001178
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001179# if defined(MBEDTLS_SSL_RENEGOTIATION)
1180 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001181 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001182 msg_len = ssl->in_hslen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001183 } else
1184# endif
Paul Bakkerec636f32012-09-09 19:17:02 +00001185 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001186 if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
1187 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1188 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001189 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001190
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001191 if ((ret = mbedtls_ssl_fetch_input(ssl, mbedtls_ssl_in_hdr_len(ssl) +
1192 msg_len)) != 0) {
1193 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
1194 return ret;
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001195 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001196
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001197 /* Done reading this record, get ready for the next one */
1198# if defined(MBEDTLS_SSL_PROTO_DTLS)
1199 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM)
1200 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001201 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001202# endif
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001203 ssl->in_left = 0;
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001204 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001205
1206 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +00001207
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001208 MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001209
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001210 ssl->handshake->update_checksum(ssl, buf, msg_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001211
1212 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001213 * Handshake layer:
1214 * 0 . 0 handshake type
1215 * 1 . 3 handshake length
1216 * 4 . 5 DTLS only: message seqence number
1217 * 6 . 8 DTLS only: fragment offset
1218 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001219 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001220 if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1221 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1222 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001223 }
1224
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001225 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001226
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001227 if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1228 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1229 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001230 }
1231
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001232 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %d",
1233 (buf[1] << 16) | (buf[2] << 8) | buf[3]));
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001234
1235 /* We don't support fragmentation of ClientHello (yet?) */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001236 if (buf[1] != 0 ||
1237 msg_len != mbedtls_ssl_hs_hdr_len(ssl) + ((buf[2] << 8) | buf[3])) {
1238 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1239 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001240 }
1241
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001242# if defined(MBEDTLS_SSL_PROTO_DTLS)
1243 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001244 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001245 * Copy the client's handshake message_seq on initial handshakes,
1246 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001247 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001248# if defined(MBEDTLS_SSL_RENEGOTIATION)
1249 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001250 /* This couldn't be done in ssl_prepare_handshake_record() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001251 unsigned int cli_msg_seq = (ssl->in_msg[4] << 8) | ssl->in_msg[5];
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001252
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001253 if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1254 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1255 "%u (expected %u)",
1256 cli_msg_seq,
1257 ssl->handshake->in_msg_seq));
1258 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001259 }
1260
1261 ssl->handshake->in_msg_seq++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001262 } else
1263# endif
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001264 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001265 unsigned int cli_msg_seq = (ssl->in_msg[4] << 8) | ssl->in_msg[5];
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001266 ssl->handshake->out_msg_seq = cli_msg_seq;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001267 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001268 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001269
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001270 /*
1271 * For now we don't support fragmentation, so make sure
1272 * fragment_offset == 0 and fragment_length == length
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001273 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001274 if (ssl->in_msg[6] != 0 || ssl->in_msg[7] != 0 || ssl->in_msg[8] != 0 ||
1275 memcmp(ssl->in_msg + 1, ssl->in_msg + 9, 3) != 0) {
1276 MBEDTLS_SSL_DEBUG_MSG(1,
1277 ("ClientHello fragmentation not supported"));
1278 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001279 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001280 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001281# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001282
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001283 buf += mbedtls_ssl_hs_hdr_len(ssl);
1284 msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001285
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001286 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001287 * ClientHello layer:
1288 * 0 . 1 protocol version
1289 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
1290 * 34 . 35 session id length (1 byte)
1291 * 35 . 34+x session id
1292 * 35+x . 35+x DTLS only: cookie length (1 byte)
1293 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001294 * .. . .. ciphersuite list length (2 bytes)
1295 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001296 * .. . .. compression alg. list length (1 byte)
1297 * .. . .. compression alg. list
1298 * .. . .. extensions length (2 bytes, optional)
1299 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001300 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001301
1302 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001303 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001304 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1305 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001306 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001307 if (msg_len < 38) {
1308 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1309 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001310 }
1311
1312 /*
1313 * Check and save the protocol version
1314 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001315 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001316
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001317 mbedtls_ssl_read_version(&ssl->major_ver, &ssl->minor_ver,
1318 ssl->conf->transport, buf);
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01001319 ssl->session_negotiate->minor_ver = ssl->minor_ver;
Paul Bakkerec636f32012-09-09 19:17:02 +00001320
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001321 ssl->handshake->max_major_ver = ssl->major_ver;
1322 ssl->handshake->max_minor_ver = ssl->minor_ver;
1323
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001324 if (ssl->major_ver < ssl->conf->min_major_ver ||
1325 ssl->minor_ver < ssl->conf->min_minor_ver) {
1326 MBEDTLS_SSL_DEBUG_MSG(
1327 1, ("client only supports ssl smaller than minimum"
1328 " [%d:%d] < [%d:%d]",
1329 ssl->major_ver, ssl->minor_ver, ssl->conf->min_major_ver,
1330 ssl->conf->min_minor_ver));
1331 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1332 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1333 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001334 }
1335
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001336 if (ssl->major_ver > ssl->conf->max_major_ver) {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001337 ssl->major_ver = ssl->conf->max_major_ver;
1338 ssl->minor_ver = ssl->conf->max_minor_ver;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001339 } else if (ssl->minor_ver > ssl->conf->max_minor_ver)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001340 ssl->minor_ver = ssl->conf->max_minor_ver;
Paul Bakkerec636f32012-09-09 19:17:02 +00001341
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001342 /*
1343 * Save client random (inc. Unix time)
1344 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001345 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001346
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001347 memcpy(ssl->handshake->randbytes, buf + 2, 32);
Paul Bakkerec636f32012-09-09 19:17:02 +00001348
1349 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001350 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001351 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001352 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001353
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001354 if (sess_len > sizeof(ssl->session_negotiate->id) ||
1355 sess_len + 34 + 2 > msg_len) /* 2 for cipherlist length field */
Paul Bakkerec636f32012-09-09 19:17:02 +00001356 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001357 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1358 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1359 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1360 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001361 }
1362
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001363 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001364
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001365 ssl->session_negotiate->id_len = sess_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001366 memset(ssl->session_negotiate->id, 0, sizeof(ssl->session_negotiate->id));
1367 memcpy(ssl->session_negotiate->id, buf + 35,
1368 ssl->session_negotiate->id_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001369
1370 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001371 * Check the cookie length and content
1372 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001373# if defined(MBEDTLS_SSL_PROTO_DTLS)
1374 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001375 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001376 cookie_len = buf[cookie_offset];
1377
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001378 if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1379 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1380 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1381 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1382 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001383 }
1384
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001385 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1386 buf + cookie_offset + 1, cookie_len);
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001387
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001388# if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
1389 if (ssl->conf->f_cookie_check != NULL
1390# if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001391 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001392# endif
1393 ) {
1394 if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1395 buf + cookie_offset + 1, cookie_len,
1396 ssl->cli_id, ssl->cli_id_len) != 0) {
1397 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001398 ssl->handshake->verify_cookie_len = 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001399 } else {
1400 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001401 ssl->handshake->verify_cookie_len = 0;
1402 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001403 } else
1404# endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001405 {
1406 /* We know we didn't send a cookie, so it should be empty */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001407 if (cookie_len != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001408 /* This may be an attacker's probe, so don't send an alert */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001409 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1410 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001411 }
1412
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001413 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001414 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001415
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001416 /*
1417 * Check the ciphersuitelist length (will be parsed later)
1418 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001419 ciph_offset = cookie_offset + 1 + cookie_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001420 } else
1421# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001422 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001423
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001424 ciph_len = (buf[ciph_offset + 0] << 8) | (buf[ciph_offset + 1]);
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001425
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001426 if (ciph_len < 2 || ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for
1427 comp.
1428 alg. len
1429 */
1430 (ciph_len % 2) != 0) {
1431 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1432 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1433 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1434 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001435 }
1436
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001437 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1438 buf + ciph_offset + 2, ciph_len);
Paul Bakkerec636f32012-09-09 19:17:02 +00001439
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001440 /*
1441 * Check the compression algorithms length and pick one
1442 */
1443 comp_offset = ciph_offset + 2 + ciph_len;
1444
1445 comp_len = buf[comp_offset];
1446
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001447 if (comp_len < 1 || comp_len > 16 || comp_len + comp_offset + 1 > msg_len) {
1448 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1449 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1450 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1451 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerec636f32012-09-09 19:17:02 +00001452 }
1453
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001454 MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression", buf + comp_offset + 1,
1455 comp_len);
Paul Bakker48916f92012-09-16 19:57:18 +00001456
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001457 ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001458 /* See comments in ssl_write_client_hello() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001459# if defined(MBEDTLS_SSL_PROTO_DTLS)
1460 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001461 ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001462# endif
1463 /*
1464 * Check the extension length
1465 */
1466 ext_offset = comp_offset + 1 + comp_len;
1467 if (msg_len > ext_offset) {
1468 if (msg_len < ext_offset + 2) {
1469 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1470 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1471 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1472 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001473 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001474
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001475 ext_len = (buf[ext_offset + 0] << 8) | (buf[ext_offset + 1]);
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001476
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001477 if (msg_len != ext_offset + 2 + ext_len) {
1478 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1479 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1480 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1481 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1482 }
1483 } else
1484 ext_len = 0;
Paul Bakker48916f92012-09-16 19:57:18 +00001485
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001486 ext = buf + ext_offset + 2;
1487 MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1488
1489 while (ext_len != 0) {
1490 unsigned int ext_id;
1491 unsigned int ext_size;
1492 if (ext_len < 4) {
1493 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1494 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1495 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1496 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1497 }
1498 ext_id = ((ext[0] << 8) | (ext[1]));
1499 ext_size = ((ext[2] << 8) | (ext[3]));
1500
1501 if (ext_size + 4 > ext_len) {
1502 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1503 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1504 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1505 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1506 }
1507 switch (ext_id) {
1508# if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001509 case MBEDTLS_TLS_EXT_SERVERNAME:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001510 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1511 if (ssl->conf->f_sni == NULL)
Simon Butcher584a5472016-05-23 16:24:52 +01001512 break;
Paul Bakker5701cdc2012-09-27 21:49:42 +00001513
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001514 ret = ssl_parse_servername_ext(ssl, ext + 4, ext_size);
1515 if (ret != 0)
1516 return ret;
Simon Butcher584a5472016-05-23 16:24:52 +01001517 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001518# endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001519
Simon Butcher584a5472016-05-23 16:24:52 +01001520 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001521 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
1522# if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001523 renegotiation_info_seen = 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001524# endif
Paul Bakker48916f92012-09-16 19:57:18 +00001525
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001526 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1527 if (ret != 0)
1528 return ret;
Simon Butcher584a5472016-05-23 16:24:52 +01001529 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001530
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001531# if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1532 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001533 case MBEDTLS_TLS_EXT_SIG_ALG:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001534 MBEDTLS_SSL_DEBUG_MSG(3,
1535 ("found signature_algorithms extension"));
Ron Eldor73a38172017-10-03 15:58:26 +03001536
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001537 ret =
1538 ssl_parse_signature_algorithms_ext(ssl, ext + 4, ext_size);
1539 if (ret != 0)
1540 return ret;
Hanno Becker7e5437a2017-04-28 17:15:26 +01001541
1542 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001543 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001544# endif /* MBEDTLS_SSL_PROTO_TLS1_2 && \
1545 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001546
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001547# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
1548 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001549 case MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001550 MBEDTLS_SSL_DEBUG_MSG(
1551 3, ("found supported elliptic curves extension"));
Paul Bakker41c83d32013-03-20 14:39:14 +01001552
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001553 ret =
1554 ssl_parse_supported_elliptic_curves(ssl, ext + 4, ext_size);
1555 if (ret != 0)
1556 return ret;
Simon Butcher584a5472016-05-23 16:24:52 +01001557 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001558
Simon Butcher584a5472016-05-23 16:24:52 +01001559 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001560 MBEDTLS_SSL_DEBUG_MSG(
1561 3, ("found supported point formats extension"));
1562 ssl->handshake->cli_exts |=
1563 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001564
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001565 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1566 if (ret != 0)
1567 return ret;
Simon Butcher584a5472016-05-23 16:24:52 +01001568 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001569# endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || \
1570 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001571
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001572# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001573 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001574 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001575
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001576 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1577 if (ret != 0)
1578 return ret;
Simon Butcher584a5472016-05-23 16:24:52 +01001579 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001580# endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001581
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001582# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001583 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001584 MBEDTLS_SSL_DEBUG_MSG(3,
1585 ("found max fragment length extension"));
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001586
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001587 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1588 if (ret != 0)
1589 return ret;
Simon Butcher584a5472016-05-23 16:24:52 +01001590 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001591# endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001592
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001593# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001594 case MBEDTLS_TLS_EXT_CID:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001595 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Becker89dcc882019-04-26 13:56:39 +01001596
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001597 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1598 if (ret != 0)
1599 return ret;
Hanno Becker89dcc882019-04-26 13:56:39 +01001600 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001601# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +01001602
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001603# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001604 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001605 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001606
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001607 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1608 if (ret != 0)
1609 return ret;
Simon Butcher584a5472016-05-23 16:24:52 +01001610 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001611# endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001612
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001613# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001614 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001615 MBEDTLS_SSL_DEBUG_MSG(
1616 3, ("found extended master secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001617
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001618 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1619 if (ret != 0)
1620 return ret;
Simon Butcher584a5472016-05-23 16:24:52 +01001621 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001622# endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001623
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001624# if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001625 case MBEDTLS_TLS_EXT_SESSION_TICKET:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001626 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001627
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001628 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1629 if (ret != 0)
1630 return ret;
Simon Butcher584a5472016-05-23 16:24:52 +01001631 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001632# endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001633
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001634# if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001635 case MBEDTLS_TLS_EXT_ALPN:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001636 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001637
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001638 ret = ssl_parse_alpn_ext(ssl, ext + 4, ext_size);
1639 if (ret != 0)
1640 return ret;
Simon Butcher584a5472016-05-23 16:24:52 +01001641 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001642# endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001643
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001644# if defined(MBEDTLS_SSL_DTLS_SRTP)
Johan Pascalb62bb512015-12-03 21:56:45 +01001645 case MBEDTLS_TLS_EXT_USE_SRTP:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001646 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascald576fdb2020-09-22 10:39:53 +02001647
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001648 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1649 if (ret != 0)
1650 return ret;
Johan Pascalb62bb512015-12-03 21:56:45 +01001651 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001652# endif /* MBEDTLS_SSL_DTLS_SRTP */
Johan Pascalb62bb512015-12-03 21:56:45 +01001653
Simon Butcher584a5472016-05-23 16:24:52 +01001654 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001655 MBEDTLS_SSL_DEBUG_MSG(
1656 3, ("unknown extension found: %u (ignoring)", ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001657 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001658
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001659 ext_len -= 4 + ext_size;
1660 ext += 4 + ext_size;
1661 }
1662
1663# if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1664 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001665
1666 /*
1667 * Try to fall back to default hash SHA1 if the client
1668 * hasn't provided any preferred signature-hash combinations.
1669 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001670 if (sig_hash_alg_ext_present == 0) {
Hanno Becker7e5437a2017-04-28 17:15:26 +01001671 mbedtls_md_type_t md_default = MBEDTLS_MD_SHA1;
1672
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001673 if (mbedtls_ssl_check_sig_hash(ssl, md_default) != 0)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001674 md_default = MBEDTLS_MD_NONE;
1675
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001676 mbedtls_ssl_sig_hash_set_const_hash(&ssl->handshake->hash_algs,
1677 md_default);
Hanno Becker7e5437a2017-04-28 17:15:26 +01001678 }
1679
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001680# endif /* MBEDTLS_SSL_PROTO_TLS1_2 && \
1681 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001682
Paul Bakker48916f92012-09-16 19:57:18 +00001683 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001684 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1685 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001686 for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1687 if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1688 MBEDTLS_SSL_DEBUG_MSG(3,
1689 ("received TLS_EMPTY_RENEGOTIATION_INFO "));
1690# if defined(MBEDTLS_SSL_RENEGOTIATION)
1691 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1692 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1693 "during renegotiation"));
1694 mbedtls_ssl_send_alert_message(
1695 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1696 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1697 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001698 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001699# endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001700 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001701 break;
1702 }
1703 }
1704
1705 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001706 * Renegotiation security checks
1707 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001708 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1709 ssl->conf->allow_legacy_renegotiation ==
1710 MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1711 MBEDTLS_SSL_DEBUG_MSG(1,
1712 ("legacy renegotiation, breaking off handshake"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001713 handshake_failure = 1;
1714 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001715# if defined(MBEDTLS_SSL_RENEGOTIATION)
1716 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001717 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001718 renegotiation_info_seen == 0) {
1719 MBEDTLS_SSL_DEBUG_MSG(
1720 1, ("renegotiation_info extension missing (secure)"));
1721 handshake_failure = 1;
1722 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1723 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1724 ssl->conf->allow_legacy_renegotiation ==
1725 MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1726 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
1727 handshake_failure = 1;
1728 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1729 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1730 renegotiation_info_seen == 1) {
1731 MBEDTLS_SSL_DEBUG_MSG(
1732 1, ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001733 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +00001734 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001735# endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001736
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001737 if (handshake_failure == 1) {
1738 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1739 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1740 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001741 }
Paul Bakker380da532012-04-18 16:10:25 +00001742
Paul Bakker41c83d32013-03-20 14:39:14 +01001743 /*
1744 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001745 * (At the end because we need information from the EC-based extensions
1746 * and certificate from the SNI callback triggered by the SNI extension.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001747 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001748 got_common_suite = 0;
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001749 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001750 ciphersuite_info = NULL;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001751
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001752 if (ssl->conf->respect_cli_pref ==
1753 MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1754 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2)
1755 for (i = 0; ciphersuites[i] != 0; i++) {
1756 if (p[0] != ((ciphersuites[i] >> 8) & 0xFF) ||
1757 p[1] != ((ciphersuites[i]) & 0xFF))
TRodziewicz8476f2f2021-06-02 14:34:47 +02001758 continue;
Paul Bakker41c83d32013-03-20 14:39:14 +01001759
TRodziewicz8476f2f2021-06-02 14:34:47 +02001760 got_common_suite = 1;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001761
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001762 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1763 &ciphersuite_info)) != 0)
1764 return ret;
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001765
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001766 if (ciphersuite_info != NULL)
TRodziewicz8476f2f2021-06-02 14:34:47 +02001767 goto have_ciphersuite;
1768 }
1769 } else {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001770 for (i = 0; ciphersuites[i] != 0; i++)
1771 for (j = 0, p = buf + ciph_offset + 2; j < ciph_len;
1772 j += 2, p += 2) {
1773 if (p[0] != ((ciphersuites[i] >> 8) & 0xFF) ||
1774 p[1] != ((ciphersuites[i]) & 0xFF))
TRodziewicz8476f2f2021-06-02 14:34:47 +02001775 continue;
1776
1777 got_common_suite = 1;
1778
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001779 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1780 &ciphersuite_info)) != 0)
1781 return ret;
TRodziewicz8476f2f2021-06-02 14:34:47 +02001782
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001783 if (ciphersuite_info != NULL)
TRodziewicz8476f2f2021-06-02 14:34:47 +02001784 goto have_ciphersuite;
1785 }
1786 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001787
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001788 if (got_common_suite) {
1789 MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1790 "but none of them usable"));
1791 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1792 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1793 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1794 } else {
1795 MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1796 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1797 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1798 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001799 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001800
1801have_ciphersuite:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001802 MBEDTLS_SSL_DEBUG_MSG(2,
1803 ("selected ciphersuite: %s", ciphersuite_info->name));
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001804
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001805 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001806 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001807
Paul Bakker5121ce52009-01-03 21:22:43 +00001808 ssl->state++;
1809
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001810# if defined(MBEDTLS_SSL_PROTO_DTLS)
1811 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM)
1812 mbedtls_ssl_recv_flight_completed(ssl);
1813# endif
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001814
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001815 /* Debugging-only output for testsuite */
1816# if defined(MBEDTLS_DEBUG_C) && defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1817 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
1818 if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) {
1819 mbedtls_pk_type_t sig_alg =
1820 mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1821 if (sig_alg != MBEDTLS_PK_NONE) {
1822 mbedtls_md_type_t md_alg = mbedtls_ssl_sig_hash_set_find(
1823 &ssl->handshake->hash_algs, sig_alg);
1824 MBEDTLS_SSL_DEBUG_MSG(
1825 3, ("client hello v3, signature_algorithm ext: %d",
1826 mbedtls_ssl_hash_from_md_alg(md_alg)));
1827 } else {
1828 MBEDTLS_SSL_DEBUG_MSG(3,
1829 ("no hash algorithm for signature algorithm "
1830 "%u - should not happen",
1831 (unsigned)sig_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01001832 }
1833 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001834# endif
Hanno Becker7e5437a2017-04-28 17:15:26 +01001835
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001836 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001837
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001838 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001839}
1840
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001841# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1842static void
1843ssl_write_cid_ext(mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen)
Hanno Becker51de2d32019-04-26 15:46:55 +01001844{
1845 unsigned char *p = buf;
1846 size_t ext_len;
1847 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1848
1849 *olen = 0;
1850
1851 /* Skip writing the extension if we don't want to use it or if
1852 * the client hasn't offered it. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001853 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED)
Hanno Becker51de2d32019-04-26 15:46:55 +01001854 return;
1855
1856 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1857 * which is at most 255, so the increment cannot overflow. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001858 if (end < p || (size_t)(end - p) < (unsigned)(ssl->own_cid_len + 5)) {
1859 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001860 return;
1861 }
1862
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001863 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
Hanno Becker51de2d32019-04-26 15:46:55 +01001864
1865 /*
Hanno Beckerebcc9132019-05-15 10:26:32 +01001866 * Quoting draft-ietf-tls-dtls-connection-id-05
1867 * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
Hanno Becker51de2d32019-04-26 15:46:55 +01001868 *
1869 * struct {
1870 * opaque cid<0..2^8-1>;
1871 * } ConnectionId;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001872 */
Hanno Becker51de2d32019-04-26 15:46:55 +01001873
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001874 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_CID >> 8) & 0xFF);
1875 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_CID)&0xFF);
1876 ext_len = (size_t)ssl->own_cid_len + 1;
1877 *p++ = (unsigned char)((ext_len >> 8) & 0xFF);
1878 *p++ = (unsigned char)((ext_len)&0xFF);
Hanno Becker51de2d32019-04-26 15:46:55 +01001879
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001880 *p++ = (uint8_t)ssl->own_cid_len;
1881 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker51de2d32019-04-26 15:46:55 +01001882
1883 *olen = ssl->own_cid_len + 5;
1884}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001885# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01001886
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001887# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1888static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1889 unsigned char *buf,
1890 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001891{
1892 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001893 const mbedtls_ssl_ciphersuite_t *suite = NULL;
1894 const mbedtls_cipher_info_t *cipher = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001895
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001896 if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001897 *olen = 0;
1898 return;
1899 }
1900
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001901 /*
1902 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1903 * from a client and then selects a stream or Authenticated Encryption
1904 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1905 * encrypt-then-MAC response extension back to the client."
1906 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001907 if ((suite = mbedtls_ssl_ciphersuite_from_id(
1908 ssl->session_negotiate->ciphersuite)) == NULL ||
1909 (cipher = mbedtls_cipher_info_from_type(suite->cipher)) == NULL ||
1910 cipher->mode != MBEDTLS_MODE_CBC) {
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01001911 *olen = 0;
1912 return;
1913 }
1914
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001915 MBEDTLS_SSL_DEBUG_MSG(3,
1916 ("server hello, adding encrypt then mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001917
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001918 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8) & 0xFF);
1919 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC)&0xFF);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001920
1921 *p++ = 0x00;
1922 *p++ = 0x00;
1923
1924 *olen = 4;
1925}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001926# endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001927
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001928# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1929static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1930 unsigned char *buf,
1931 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001932{
1933 unsigned char *p = buf;
1934
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001935 if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001936 *olen = 0;
1937 return;
1938 }
1939
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001940 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1941 "extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001942
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001943 *p++ =
1944 (unsigned char)((MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8) & 0xFF);
1945 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET)&0xFF);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001946
1947 *p++ = 0x00;
1948 *p++ = 0x00;
1949
1950 *olen = 4;
1951}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001952# endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001953
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001954# if defined(MBEDTLS_SSL_SESSION_TICKETS)
1955static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001956 unsigned char *buf,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001957 size_t *olen)
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001958{
1959 unsigned char *p = buf;
1960
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001961 if (ssl->handshake->new_session_ticket == 0) {
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001962 *olen = 0;
1963 return;
1964 }
1965
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001966 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001967
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001968 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_SESSION_TICKET >> 8) & 0xFF);
1969 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_SESSION_TICKET)&0xFF);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001970
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001971 *p++ = 0x00;
1972 *p++ = 0x00;
1973
1974 *olen = 4;
1975}
1976# endif /* MBEDTLS_SSL_SESSION_TICKETS */
1977
1978static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1979 unsigned char *buf,
1980 size_t *olen)
1981{
1982 unsigned char *p = buf;
1983
1984 if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
1985 *olen = 0;
1986 return;
1987 }
1988
1989 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
1990
1991 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8) & 0xFF);
1992 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_RENEGOTIATION_INFO)&0xFF);
1993
1994# if defined(MBEDTLS_SSL_RENEGOTIATION)
1995 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001996 *p++ = 0x00;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001997 *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001998 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001999
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002000 memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002001 p += ssl->verify_data_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002002 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002003 p += ssl->verify_data_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002004 } else
2005# endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002006 {
2007 *p++ = 0x00;
2008 *p++ = 0x01;
2009 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002010 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02002011
2012 *olen = p - buf;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002013}
2014
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002015# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2016static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
2017 unsigned char *buf,
2018 size_t *olen)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002019{
2020 unsigned char *p = buf;
2021
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002022 if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002023 *olen = 0;
2024 return;
2025 }
2026
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002027 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002028
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002029 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8) & 0xFF);
2030 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH)&0xFF);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002031
2032 *p++ = 0x00;
2033 *p++ = 1;
2034
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02002035 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002036
2037 *olen = 5;
2038}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002039# endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002040
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002041# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
2042 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2043static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
2044 unsigned char *buf,
2045 size_t *olen)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002046{
2047 unsigned char *p = buf;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002048 ((void)ssl);
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002049
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002050 if ((ssl->handshake->cli_exts &
2051 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
Paul Bakker677377f2013-10-28 12:54:26 +01002052 *olen = 0;
2053 return;
2054 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002055
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002056 MBEDTLS_SSL_DEBUG_MSG(3,
2057 ("server hello, supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002058
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002059 *p++ =
2060 (unsigned char)((MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8) & 0xFF);
2061 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS)&0xFF);
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002062
2063 *p++ = 0x00;
2064 *p++ = 2;
2065
2066 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002067 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002068
2069 *olen = 6;
2070}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002071# endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || \
2072 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002073
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002074# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2075static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
2076 unsigned char *buf,
2077 size_t *olen)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002078{
Janos Follath865b3eb2019-12-16 11:46:15 +00002079 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002080 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10002081 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002082 size_t kkpp_len;
2083
2084 *olen = 0;
2085
2086 /* Skip costly computation if not needed */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002087 if (ssl->handshake->ciphersuite_info->key_exchange !=
2088 MBEDTLS_KEY_EXCHANGE_ECJPAKE)
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002089 return;
2090
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002091 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002092
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002093 if (end - p < 4) {
2094 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002095 return;
2096 }
2097
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002098 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8) & 0xFF);
2099 *p++ = (unsigned char)((MBEDTLS_TLS_EXT_ECJPAKE_KKPP)&0xFF);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002100
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002101 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx, p + 2,
2102 end - p - 2, &kkpp_len,
2103 ssl->conf->f_rng, ssl->conf->p_rng);
2104 if (ret != 0) {
2105 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002106 return;
2107 }
2108
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002109 *p++ = (unsigned char)((kkpp_len >> 8) & 0xFF);
2110 *p++ = (unsigned char)((kkpp_len)&0xFF);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002111
2112 *olen = kkpp_len + 4;
2113}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002114# endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002115
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002116# if defined(MBEDTLS_SSL_ALPN)
2117static void
2118ssl_write_alpn_ext(mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen)
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002119{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002120 if (ssl->alpn_chosen == NULL) {
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002121 *olen = 0;
2122 return;
2123 }
2124
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002125 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding alpn extension"));
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002126
2127 /*
2128 * 0 . 1 ext identifier
2129 * 2 . 3 ext length
2130 * 4 . 5 protocol list length
2131 * 6 . 6 protocol name length
2132 * 7 . 7+n protocol name
2133 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002134 buf[0] = (unsigned char)((MBEDTLS_TLS_EXT_ALPN >> 8) & 0xFF);
2135 buf[1] = (unsigned char)((MBEDTLS_TLS_EXT_ALPN)&0xFF);
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002136
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002137 *olen = 7 + strlen(ssl->alpn_chosen);
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002138
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002139 buf[2] = (unsigned char)(((*olen - 4) >> 8) & 0xFF);
2140 buf[3] = (unsigned char)(((*olen - 4)) & 0xFF);
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002141
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002142 buf[4] = (unsigned char)(((*olen - 6) >> 8) & 0xFF);
2143 buf[5] = (unsigned char)(((*olen - 6)) & 0xFF);
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002144
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002145 buf[6] = (unsigned char)(((*olen - 7)) & 0xFF);
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002146
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002147 memcpy(buf + 7, ssl->alpn_chosen, *olen - 7);
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002148}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002149# endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002150
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002151# if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
2152static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
2153 unsigned char *buf,
2154 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +01002155{
Ron Eldor75870ec2018-12-06 17:31:55 +02002156 size_t mki_len = 0, ext_len = 0;
Ron Eldor089c9fe2018-12-06 17:12:49 +02002157 uint16_t profile_value = 0;
Johan Pascal8f70fba2020-09-02 10:32:06 +02002158 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
2159
2160 *olen = 0;
Ron Eldor591f1622018-01-22 12:30:04 +02002161
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002162 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
2163 (ssl->dtls_srtp_info.chosen_dtls_srtp_profile ==
2164 MBEDTLS_TLS_SRTP_UNSET)) {
Johan Pascalb62bb512015-12-03 21:56:45 +01002165 return;
2166 }
2167
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002168 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01002169
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002170 if (ssl->conf->dtls_srtp_mki_support ==
2171 MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02002172 mki_len = ssl->dtls_srtp_info.mki_len;
2173 }
2174
Johan Pascal9bc97ca2020-09-21 23:44:45 +02002175 /* The extension total size is 9 bytes :
2176 * - 2 bytes for the extension tag
2177 * - 2 bytes for the total size
2178 * - 2 bytes for the protection profile length
2179 * - 2 bytes for the protection profile
2180 * - 1 byte for the mki length
2181 * + the actual mki length
2182 * Check we have enough room in the output buffer */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002183 if ((size_t)(end - buf) < mki_len + 9) {
2184 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
Johan Pascal8f70fba2020-09-02 10:32:06 +02002185 return;
2186 }
2187
Johan Pascalb62bb512015-12-03 21:56:45 +01002188 /* extension */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002189 buf[0] = (unsigned char)((MBEDTLS_TLS_EXT_USE_SRTP >> 8) & 0xFF);
2190 buf[1] = (unsigned char)((MBEDTLS_TLS_EXT_USE_SRTP)&0xFF);
Ron Eldoref72faf2018-07-12 11:54:20 +03002191 /*
2192 * total length 5 and mki value: only one profile(2 bytes)
2193 * and length(2 bytes) and srtp_mki )
2194 */
Ron Eldor591f1622018-01-22 12:30:04 +02002195 ext_len = 5 + mki_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002196 buf[2] = (unsigned char)((ext_len >> 8) & 0xFF);
2197 buf[3] = (unsigned char)(ext_len & 0xFF);
Johan Pascalb62bb512015-12-03 21:56:45 +01002198
2199 /* protection profile length: 2 */
2200 buf[4] = 0x00;
2201 buf[5] = 0x02;
Johan Pascal43f94902020-09-22 12:25:52 +02002202 profile_value = mbedtls_ssl_check_srtp_profile_value(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002203 ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2204 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2205 buf[6] = (unsigned char)((profile_value >> 8) & 0xFF);
2206 buf[7] = (unsigned char)(profile_value & 0xFF);
2207 } else {
2208 MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
Ron Eldor089c9fe2018-12-06 17:12:49 +02002209 return;
Johan Pascalb62bb512015-12-03 21:56:45 +01002210 }
2211
Ron Eldor591f1622018-01-22 12:30:04 +02002212 buf[8] = mki_len & 0xFF;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002213 memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
Johan Pascalb62bb512015-12-03 21:56:45 +01002214
Ron Eldor591f1622018-01-22 12:30:04 +02002215 *olen = 9 + mki_len;
Johan Pascalb62bb512015-12-03 21:56:45 +01002216}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002217# endif /* MBEDTLS_SSL_DTLS_SRTP */
Johan Pascalb62bb512015-12-03 21:56:45 +01002218
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002219# if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
2220static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002221{
Janos Follath865b3eb2019-12-16 11:46:15 +00002222 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002223 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002224 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002225
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002226 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002227
2228 /*
2229 * struct {
2230 * ProtocolVersion server_version;
2231 * opaque cookie<0..2^8-1>;
2232 * } HelloVerifyRequest;
2233 */
2234
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002235 /* The RFC is not clear on this point, but sending the actual negotiated
2236 * version looks like the most interoperable thing to do. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002237 mbedtls_ssl_write_version(ssl->major_ver, ssl->minor_ver,
2238 ssl->conf->transport, p);
2239 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002240 p += 2;
2241
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002242 /* If we get here, f_cookie_check is not null */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002243 if (ssl->conf->f_cookie_write == NULL) {
2244 MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2245 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002246 }
2247
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002248 /* Skip length byte until we know the length */
2249 cookie_len_byte = p++;
2250
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002251 if ((ret = ssl->conf->f_cookie_write(
2252 ssl->conf->p_cookie, &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2253 ssl->cli_id, ssl->cli_id_len)) != 0) {
2254 MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2255 return ret;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002256 }
2257
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002258 *cookie_len_byte = (unsigned char)(p - (cookie_len_byte + 1));
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002259
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002260 MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1,
2261 *cookie_len_byte);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002262
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002263 ssl->out_msglen = p - ssl->out_msg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002264 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002265 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002266
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002267 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002268
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002269 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2270 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2271 return ret;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002272 }
2273
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002274# if defined(MBEDTLS_SSL_PROTO_DTLS)
2275 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2276 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2277 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2278 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002279 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002280# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002281
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002282 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002283
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002284 return 0;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002285}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002286# endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002287
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002288static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
Hanno Becker64ce9742021-04-15 08:19:40 +01002289{
2290 int ret;
Hanno Beckera5b1a392021-04-15 16:48:01 +01002291 mbedtls_ssl_session session_tmp;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002292 mbedtls_ssl_session *const session = ssl->session_negotiate;
Hanno Becker64ce9742021-04-15 08:19:40 +01002293
2294 /* Resume is 0 by default, see ssl_handshake_init().
2295 * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002296 if (ssl->handshake->resume == 1)
Hanno Becker64ce9742021-04-15 08:19:40 +01002297 return;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002298 if (session->id_len == 0)
Hanno Becker64ce9742021-04-15 08:19:40 +01002299 return;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002300 if (ssl->conf->f_get_cache == NULL)
Hanno Becker64ce9742021-04-15 08:19:40 +01002301 return;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002302# if defined(MBEDTLS_SSL_RENEGOTIATION)
2303 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE)
Hanno Becker64ce9742021-04-15 08:19:40 +01002304 return;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002305# endif
Hanno Becker64ce9742021-04-15 08:19:40 +01002306
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002307 mbedtls_ssl_session_init(&session_tmp);
Hanno Beckera5b1a392021-04-15 16:48:01 +01002308
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002309 ret = ssl->conf->f_get_cache(ssl->conf->p_cache, session->id,
2310 session->id_len, &session_tmp);
2311 if (ret != 0)
Hanno Becker64ce9742021-04-15 08:19:40 +01002312 goto exit;
2313
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002314 if (session->ciphersuite != session_tmp.ciphersuite ||
2315 session->compression != session_tmp.compression) {
Hanno Becker64ce9742021-04-15 08:19:40 +01002316 /* Mismatch between cached and negotiated session */
2317 goto exit;
2318 }
2319
2320 /* Move semantics */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002321 mbedtls_ssl_session_free(session);
Hanno Becker64ce9742021-04-15 08:19:40 +01002322 *session = session_tmp;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002323 memset(&session_tmp, 0, sizeof(session_tmp));
Hanno Becker64ce9742021-04-15 08:19:40 +01002324
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002325 MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
Hanno Becker64ce9742021-04-15 08:19:40 +01002326 ssl->handshake->resume = 1;
2327
2328exit:
2329
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002330 mbedtls_ssl_session_free(&session_tmp);
Hanno Becker64ce9742021-04-15 08:19:40 +01002331}
2332
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002333static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002334{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002335# if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002336 mbedtls_time_t t;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002337# endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002338 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002339 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002340 unsigned char *buf, *p;
2341
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002342 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002343
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002344# if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
2345 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2346 ssl->handshake->verify_cookie_len != 0) {
2347 MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2348 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002349
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002350 return ssl_write_hello_verify_request(ssl);
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002351 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002352# endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002353
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002354 if (ssl->conf->f_rng == NULL) {
2355 MBEDTLS_SSL_DEBUG_MSG(1, ("no RNG provided"));
2356 return MBEDTLS_ERR_SSL_NO_RNG;
Paul Bakkera9a028e2013-11-21 17:31:06 +01002357 }
2358
Paul Bakker5121ce52009-01-03 21:22:43 +00002359 /*
2360 * 0 . 0 handshake type
2361 * 1 . 3 handshake length
2362 * 4 . 5 protocol version
2363 * 6 . 9 UNIX time()
2364 * 10 . 37 random bytes
2365 */
2366 buf = ssl->out_msg;
2367 p = buf + 4;
2368
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002369 mbedtls_ssl_write_version(ssl->major_ver, ssl->minor_ver,
2370 ssl->conf->transport, p);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002371 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002372
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002373 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]", buf[4],
2374 buf[5]));
Paul Bakker5121ce52009-01-03 21:22:43 +00002375
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002376# if defined(MBEDTLS_HAVE_TIME)
2377 t = mbedtls_time(NULL);
2378 *p++ = (unsigned char)(t >> 24);
2379 *p++ = (unsigned char)(t >> 16);
2380 *p++ = (unsigned char)(t >> 8);
2381 *p++ = (unsigned char)(t);
Paul Bakker5121ce52009-01-03 21:22:43 +00002382
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002383 MBEDTLS_SSL_DEBUG_MSG(
2384 3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2385 (long long)t));
2386# else
2387 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0)
2388 return ret;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002389
2390 p += 4;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002391# endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002392
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002393 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 28)) != 0)
2394 return ret;
Paul Bakkera3d195c2011-11-27 21:07:34 +00002395
2396 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +00002397
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002398 memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002399
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002400 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00002401
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002402 ssl_handle_id_based_session_resumption(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002403
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002404 if (ssl->handshake->resume == 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002405 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002406 * New session, create a new session id,
2407 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002408 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002409 ssl->state++;
2410
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002411# if defined(MBEDTLS_HAVE_TIME)
2412 ssl->session_negotiate->start = mbedtls_time(NULL);
2413# endif
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002414
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002415# if defined(MBEDTLS_SSL_SESSION_TICKETS)
2416 if (ssl->handshake->new_session_ticket != 0) {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002417 ssl->session_negotiate->id_len = n = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002418 memset(ssl->session_negotiate->id, 0, 32);
2419 } else
2420# endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002421 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002422 ssl->session_negotiate->id_len = n = 32;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002423 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng,
2424 ssl->session_negotiate->id, n)) != 0)
2425 return ret;
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002426 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002427 } else {
Paul Bakker5121ce52009-01-03 21:22:43 +00002428 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002429 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002430 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002431 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002432 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002433
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002434 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2435 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2436 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002437 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002438 }
2439
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002440 /*
2441 * 38 . 38 session id length
2442 * 39 . 38+n session id
2443 * 39+n . 40+n chosen ciphersuite
2444 * 41+n . 41+n chosen compression alg.
2445 * 42+n . 43+n extensions length
2446 * 44+n . 43+n+m extensions
2447 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002448 *p++ = (unsigned char)ssl->session_negotiate->id_len;
2449 memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002450 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002451
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002452 MBEDTLS_SSL_DEBUG_MSG(
2453 3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2454 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n);
2455 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2456 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002457
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002458 *p++ = (unsigned char)(ssl->session_negotiate->ciphersuite >> 8);
2459 *p++ = (unsigned char)(ssl->session_negotiate->ciphersuite);
2460 *p++ = (unsigned char)(ssl->session_negotiate->compression);
Paul Bakker5121ce52009-01-03 21:22:43 +00002461
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002462 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2463 mbedtls_ssl_get_ciphersuite_name(
2464 ssl->session_negotiate->ciphersuite)));
2465 MBEDTLS_SSL_DEBUG_MSG(3,
2466 ("server hello, compress alg.: 0x%02X",
2467 (unsigned int)ssl->session_negotiate->compression));
Paul Bakker48916f92012-09-16 19:57:18 +00002468
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002469 /*
2470 * First write extensions, then the total length
2471 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002472 ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002473 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002474
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002475# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2476 ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002477 ext_len += olen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002478# endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002479
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002480# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2481 ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
Hanno Becker51de2d32019-04-26 15:46:55 +01002482 ext_len += olen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002483# endif
Hanno Becker51de2d32019-04-26 15:46:55 +01002484
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002485# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2486 ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002487 ext_len += olen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002488# endif
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002489
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002490# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2491 ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002492 ext_len += olen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002493# endif
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002494
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002495# if defined(MBEDTLS_SSL_SESSION_TICKETS)
2496 ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002497 ext_len += olen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002498# endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002499
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002500# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
2501 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2502 if (mbedtls_ssl_ciphersuite_uses_ec(mbedtls_ssl_ciphersuite_from_id(
2503 ssl->session_negotiate->ciphersuite))) {
2504 ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
Ron Eldor755bb6a2018-02-14 19:30:48 +02002505 ext_len += olen;
2506 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002507# endif
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002508
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002509# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2510 ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002511 ext_len += olen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002512# endif
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002513
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002514# if defined(MBEDTLS_SSL_ALPN)
2515 ssl_write_alpn_ext(ssl, p + 2 + ext_len, &olen);
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002516 ext_len += olen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002517# endif
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002518
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002519# if defined(MBEDTLS_SSL_DTLS_SRTP)
2520 ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
Johan Pascalc3ccd982020-10-28 17:18:18 +01002521 ext_len += olen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002522# endif
Johan Pascalb62bb512015-12-03 21:56:45 +01002523
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002524 MBEDTLS_SSL_DEBUG_MSG(
2525 3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2526 ext_len));
Paul Bakker48916f92012-09-16 19:57:18 +00002527
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002528 if (ext_len > 0) {
2529 *p++ = (unsigned char)((ext_len >> 8) & 0xFF);
2530 *p++ = (unsigned char)((ext_len)&0xFF);
Paul Bakkera7036632014-04-30 10:15:38 +02002531 p += ext_len;
2532 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002533
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002534 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002535 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002536 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002537
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002538 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002539
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002540 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002541
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002542 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002543}
2544
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002545# if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2546static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002547{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002548 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002549 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002550
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002551 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002552
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002553 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2554 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002555 ssl->state++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002556 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002557 }
2558
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002559 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2560 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002561}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002562# else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
2563static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002564{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002565 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002566 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002567 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002568 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002569 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002570 unsigned char *buf, *p;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002571 const unsigned char *const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002572 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002573 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002574
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002575 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002576
2577 ssl->state++;
2578
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002579# if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2580 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET)
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002581 authmode = ssl->handshake->sni_authmode;
2582 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002583# endif
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002584 authmode = ssl->conf->authmode;
2585
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002586 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2587 authmode == MBEDTLS_SSL_VERIFY_NONE) {
2588 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2589 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002590 }
2591
2592 /*
2593 * 0 . 0 handshake type
2594 * 1 . 3 handshake length
2595 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002596 * 5 .. m-1 cert types
2597 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002598 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002599 * n .. n+1 length of all DNs
2600 * n+2 .. n+3 length of DN 1
2601 * n+4 .. ... Distinguished Name #1
2602 * ... .. ... length of DN 2, etc.
2603 */
2604 buf = ssl->out_msg;
2605 p = buf + 4;
2606
2607 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002608 * Supported certificate types
2609 *
2610 * ClientCertificateType certificate_types<1..2^8-1>;
2611 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002612 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002613 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002614
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002615# if defined(MBEDTLS_RSA_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002616 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002617# endif
2618# if defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002619 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002620# endif
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002621
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002622 p[0] = (unsigned char)ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002623 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002624
Paul Bakker577e0062013-08-28 11:57:20 +02002625 sa_len = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002626# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Paul Bakker926af752012-11-23 13:38:07 +01002627 /*
2628 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002629 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002630 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2631 *
2632 * struct {
2633 * HashAlgorithm hash;
2634 * SignatureAlgorithm signature;
2635 * } SignatureAndHashAlgorithm;
2636 *
2637 * enum { (255) } HashAlgorithm;
2638 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002639 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002640 if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) {
Simon Butcher99000142016-10-13 17:21:01 +01002641 const int *cur;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002642
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002643 /*
2644 * Supported signature algorithms
2645 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002646 for (cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++) {
2647 unsigned char hash = mbedtls_ssl_hash_from_md_alg(*cur);
Simon Butcher99000142016-10-13 17:21:01 +01002648
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002649 if (MBEDTLS_SSL_HASH_NONE == hash ||
2650 mbedtls_ssl_set_calc_verify_md(ssl, hash))
Simon Butcher99000142016-10-13 17:21:01 +01002651 continue;
2652
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002653# if defined(MBEDTLS_RSA_C)
Simon Butcher99000142016-10-13 17:21:01 +01002654 p[2 + sa_len++] = hash;
2655 p[2 + sa_len++] = MBEDTLS_SSL_SIG_RSA;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002656# endif
2657# if defined(MBEDTLS_ECDSA_C)
Simon Butcher99000142016-10-13 17:21:01 +01002658 p[2 + sa_len++] = hash;
2659 p[2 + sa_len++] = MBEDTLS_SSL_SIG_ECDSA;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002660# endif
Simon Butcher99000142016-10-13 17:21:01 +01002661 }
Paul Bakker926af752012-11-23 13:38:07 +01002662
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002663 p[0] = (unsigned char)(sa_len >> 8);
2664 p[1] = (unsigned char)(sa_len);
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002665 sa_len += 2;
2666 p += sa_len;
Paul Bakker926af752012-11-23 13:38:07 +01002667 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002668# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002669
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002670 /*
2671 * DistinguishedName certificate_authorities<0..2^16-1>;
2672 * opaque DistinguishedName<1..2^16-1>;
2673 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002674 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002675
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002676 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002677
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002678 if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002679 /* NOTE: If trusted certificates are provisioned
2680 * via a CA callback (configured through
2681 * `mbedtls_ssl_conf_ca_cb()`, then the
2682 * CertificateRequest is currently left empty. */
2683
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002684# if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2685 if (ssl->handshake->sni_ca_chain != NULL)
Janos Follath088ce432017-04-10 12:42:31 +01002686 crt = ssl->handshake->sni_ca_chain;
2687 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002688# endif
Janos Follath088ce432017-04-10 12:42:31 +01002689 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002690
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002691 while (crt != NULL && crt->version != 0) {
irwirc9bc3002020-04-01 13:46:36 +03002692 /* It follows from RFC 5280 A.1 that this length
2693 * can be represented in at most 11 bits. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002694 dn_size = (uint16_t)crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002695
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002696 if (end < p || (size_t)(end - p) < 2 + (size_t)dn_size) {
2697 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
Janos Follath088ce432017-04-10 12:42:31 +01002698 break;
2699 }
2700
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002701 *p++ = (unsigned char)(dn_size >> 8);
2702 *p++ = (unsigned char)(dn_size);
2703 memcpy(p, crt->subject_raw.p, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002704 p += dn_size;
2705
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002706 MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
Janos Follath088ce432017-04-10 12:42:31 +01002707
2708 total_dn_size += 2 + dn_size;
2709 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002710 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002711 }
2712
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002713 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002714 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002715 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
2716 ssl->out_msg[4 + ct_len + sa_len] = (unsigned char)(total_dn_size >> 8);
2717 ssl->out_msg[5 + ct_len + sa_len] = (unsigned char)(total_dn_size);
Paul Bakker5121ce52009-01-03 21:22:43 +00002718
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002719 ret = mbedtls_ssl_write_handshake_msg(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00002720
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002721 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002722
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002723 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002724}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002725# endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002726
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002727# if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2728 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2729static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002730{
Janos Follath865b3eb2019-12-16 11:46:15 +00002731 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002732
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002733 if (!mbedtls_pk_can_do(mbedtls_ssl_own_key(ssl), MBEDTLS_PK_ECKEY)) {
2734 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2735 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002736 }
2737
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002738 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
2739 mbedtls_pk_ec(*mbedtls_ssl_own_key(ssl)),
2740 MBEDTLS_ECDH_OURS)) != 0) {
2741 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2742 return ret;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002743 }
2744
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002745 return 0;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002746}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002747# endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2748 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002749
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002750# if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
2751 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
2752static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2753 size_t *signature_len)
Paul Bakker41c83d32013-03-20 14:39:14 +01002754{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002755 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2756 * signature length which will be added in ssl_write_server_key_exchange
2757 * after the call to ssl_prepare_server_key_exchange.
2758 * ssl_write_server_key_exchange also takes care of incrementing
2759 * ssl->out_msglen. */
2760 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002761 size_t sig_max_len =
2762 (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN - sig_start);
2763 int ret =
2764 ssl->conf->f_async_resume(ssl, sig_start, signature_len, sig_max_len);
2765 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002766 ssl->handshake->async_in_progress = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002767 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002768 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002769 MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2770 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002771}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002772# endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
2773 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002774
Gilles Peskined3eb0612018-01-08 17:07:44 +01002775/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002776 * calculating the signature if any, but excluding formatting the
2777 * signature and sending the message. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002778static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2779 size_t *signature_len)
Paul Bakker5690efc2011-05-26 13:16:06 +00002780{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002781 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002782 ssl->handshake->ciphersuite_info;
2783
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002784# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
2785# if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002786 unsigned char *dig_signed = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002787# endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
2788# endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002789
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002790 (void)ciphersuite_info; /* unused in some configurations */
2791# if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
2792 (void)signature_len;
2793# endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002794
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002795# if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
2796# if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2797 size_t out_buf_len = ssl->out_buf_len - (ssl->out_msg - ssl->out_buf);
2798# else
2799 size_t out_buf_len =
2800 MBEDTLS_SSL_OUT_BUFFER_LEN - (ssl->out_msg - ssl->out_buf);
2801# endif
2802# endif
Gilles Peskinef00f1522021-06-22 00:09:00 +02002803
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002804 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00002805
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002806 /*
2807 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002808 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002809 *
2810 */
2811
2812 /*
2813 * - ECJPAKE key exchanges
2814 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002815# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2816 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002817 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002818 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002819
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002820 ret = mbedtls_ecjpake_write_round_two(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002821 &ssl->handshake->ecjpake_ctx, ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10002822 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002823 ssl->conf->f_rng, ssl->conf->p_rng);
2824 if (ret != 0) {
2825 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2826 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002827 }
2828
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002829 ssl->out_msglen += len;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002830 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002831# endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002832
Hanno Becker1aa267c2017-04-28 17:08:27 +01002833 /*
2834 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2835 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2836 * we use empty support identity hints here.
2837 **/
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002838# if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
2839 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2840 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2841 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002842 ssl->out_msg[ssl->out_msglen++] = 0x00;
2843 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002844 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002845# endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED || \
2846 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002847
Hanno Becker7e5437a2017-04-28 17:15:26 +01002848 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002849 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002850 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002851# if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
2852 if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
Janos Follath865b3eb2019-12-16 11:46:15 +00002853 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002854 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002855
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002856 if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2857 MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2858 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002859 }
2860
Paul Bakker41c83d32013-03-20 14:39:14 +01002861 /*
2862 * Ephemeral DH parameters:
2863 *
2864 * struct {
2865 * opaque dh_p<1..2^16-1>;
2866 * opaque dh_g<1..2^16-1>;
2867 * opaque dh_Ys<1..2^16-1>;
2868 * } ServerDHParams;
2869 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002870 if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2871 &ssl->conf->dhm_P,
2872 &ssl->conf->dhm_G)) != 0) {
2873 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2874 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002875 }
Paul Bakker48916f92012-09-16 19:57:18 +00002876
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002877 if ((ret = mbedtls_dhm_make_params(
2878 &ssl->handshake->dhm_ctx,
2879 (int)mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2880 ssl->out_msg + ssl->out_msglen, &len, ssl->conf->f_rng,
2881 ssl->conf->p_rng)) != 0) {
2882 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2883 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002884 }
2885
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002886# if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002887 dig_signed = ssl->out_msg + ssl->out_msglen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002888# endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002889
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002890 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002891
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002892 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2893 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2894 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2895 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker41c83d32013-03-20 14:39:14 +01002896 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002897# endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002898
Hanno Becker1aa267c2017-04-28 17:08:27 +01002899 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002900 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002901 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002902# if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
2903 if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
Paul Bakker41c83d32013-03-20 14:39:14 +01002904 /*
2905 * Ephemeral ECDH parameters:
2906 *
2907 * struct {
2908 * ECParameters curve_params;
2909 * ECPoint public;
2910 * } ServerECDHParams;
2911 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002912 const mbedtls_ecp_curve_info **curve = NULL;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002913 const mbedtls_ecp_group_id *gid;
Janos Follath865b3eb2019-12-16 11:46:15 +00002914 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01002915 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01002916
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002917 /* Match our preference list against the offered curves */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002918 for (gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++)
2919 for (curve = ssl->handshake->curves; *curve != NULL; curve++)
2920 if ((*curve)->grp_id == *gid)
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002921 goto curve_matching_done;
2922
2923curve_matching_done:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002924 if (curve == NULL || *curve == NULL) {
2925 MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2926 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Gergely Budai987bfb52014-01-19 21:48:42 +01002927 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01002928
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002929 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s", (*curve)->name));
Gergely Budai987bfb52014-01-19 21:48:42 +01002930
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002931 if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
2932 (*curve)->grp_id)) != 0) {
2933 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
2934 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002935 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002936
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002937 if ((ret = mbedtls_ecdh_make_params(
2938 &ssl->handshake->ecdh_ctx, &len,
2939 ssl->out_msg + ssl->out_msglen,
2940 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
2941 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2942 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
2943 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002944 }
2945
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002946# if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002947 dig_signed = ssl->out_msg + ssl->out_msglen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002948# endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002949
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002950 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002951
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002952 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
2953 MBEDTLS_DEBUG_ECDH_Q);
Paul Bakker41c83d32013-03-20 14:39:14 +01002954 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002955# endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002956
Hanno Becker1aa267c2017-04-28 17:08:27 +01002957 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002958 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002959 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002960 * exchange parameters, compute and add the signature here.
2961 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01002962 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002963# if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
2964 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
Gilles Peskine1004c192018-01-08 16:59:14 +01002965 size_t dig_signed_len = ssl->out_msg + ssl->out_msglen - dig_signed;
Gilles Peskineca1d7422018-04-24 11:53:22 +02002966 size_t hashlen = 0;
Gilles Peskinee1efdf92018-01-05 21:18:37 +01002967 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Janos Follath865b3eb2019-12-16 11:46:15 +00002968 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00002969
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02002970 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002971 * 2.1: Choose hash algorithm:
TRodziewicz4ca18aa2021-05-20 14:46:20 +02002972 * For TLS 1.2, obey signature-hash-algorithm extension
2973 * to choose appropriate hash.
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002974 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002975
2976 mbedtls_md_type_t md_alg;
2977
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002978# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002979 mbedtls_pk_type_t sig_alg =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002980 mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
2981 if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) {
TRodziewicz4ca18aa2021-05-20 14:46:20 +02002982 /* For TLS 1.2, obey signature-hash-algorithm extension
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002983 * (RFC 5246, Sec. 7.4.1.4.1). */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002984 if (sig_alg == MBEDTLS_PK_NONE ||
2985 (md_alg = mbedtls_ssl_sig_hash_set_find(
2986 &ssl->handshake->hash_algs, sig_alg)) == MBEDTLS_MD_NONE) {
2987 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Hanno Becker4cb1f4d2017-10-10 15:59:57 +01002988 /* (... because we choose a cipher suite
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002989 * only if there is a matching hash.) */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002990 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002991 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002992 } else {
2993 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2994 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002995 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002996# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002997
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002998 MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing",
2999 (unsigned)md_alg));
Hanno Becker7e5437a2017-04-28 17:15:26 +01003000
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003001 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003002 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003003 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003004# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3005 if (md_alg != MBEDTLS_MD_NONE) {
3006 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(
3007 ssl, hash, &hashlen, dig_signed, dig_signed_len, md_alg);
3008 if (ret != 0)
3009 return ret;
3010 } else
3011# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003012 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003013 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3014 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02003015 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003016
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003017 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003018
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003019 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003020 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003021 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003022# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3023 if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) {
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003024 /*
3025 * For TLS 1.2, we need to specify signature and hash algorithm
Hanno Becker7e5437a2017-04-28 17:15:26 +01003026 * explicitly through a prefix to the signature.
3027 *
3028 * struct {
3029 * HashAlgorithm hash;
3030 * SignatureAlgorithm signature;
3031 * } SignatureAndHashAlgorithm;
3032 *
3033 * struct {
3034 * SignatureAndHashAlgorithm algorithm;
3035 * opaque signature<0..2^16-1>;
3036 * } DigitallySigned;
3037 *
3038 */
3039
Gilles Peskine1004c192018-01-08 16:59:14 +01003040 ssl->out_msg[ssl->out_msglen++] =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003041 mbedtls_ssl_hash_from_md_alg(md_alg);
Gilles Peskine1004c192018-01-08 16:59:14 +01003042 ssl->out_msg[ssl->out_msglen++] =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003043 mbedtls_ssl_sig_from_pk_alg(sig_alg);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003044 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003045# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003046
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003047# if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3048 if (ssl->conf->f_async_sign_start != NULL) {
3049 ret = ssl->conf->f_async_sign_start(ssl, mbedtls_ssl_own_cert(ssl),
3050 md_alg, hash, hashlen);
3051 switch (ret) {
3052 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3053 /* act as if f_async_sign was null */
3054 break;
3055 case 0:
3056 ssl->handshake->async_in_progress = 1;
3057 return ssl_resume_server_key_exchange(ssl, signature_len);
3058 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3059 ssl->handshake->async_in_progress = 1;
3060 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3061 default:
3062 MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3063 return ret;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003064 }
3065 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003066# endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003067
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003068 if (mbedtls_ssl_own_key(ssl) == NULL) {
3069 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3070 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003071 }
3072
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003073 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3074 * signature length which will be added in ssl_write_server_key_exchange
3075 * after the call to ssl_prepare_server_key_exchange.
3076 * ssl_write_server_key_exchange also takes care of incrementing
3077 * ssl->out_msglen. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003078 if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl), md_alg, hash,
3079 hashlen, ssl->out_msg + ssl->out_msglen + 2,
3080 out_buf_len - ssl->out_msglen - 2,
3081 signature_len, ssl->conf->f_rng,
3082 ssl->conf->p_rng)) != 0) {
3083 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3084 return ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003085 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003086 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003087# endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003088
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003089 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003090}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003091
Gilles Peskined3eb0612018-01-08 17:07:44 +01003092/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003093 * that do not include a ServerKeyExchange message, do nothing. Either
3094 * way, if successful, move on to the next step in the SSL state
3095 * machine. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003096static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003097{
Janos Follath865b3eb2019-12-16 11:46:15 +00003098 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003099 size_t signature_len = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003100# if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003101 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003102 ssl->handshake->ciphersuite_info;
3103# endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003104
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003105 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003106
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003107# if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003108 /* Extract static ECDH parameters and abort if ServerKeyExchange
3109 * is not needed. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003110 if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003111 /* For suites involving ECDH, extract DH parameters
3112 * from certificate at this point. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003113# if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
3114 if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3115 ssl_get_ecdh_params_from_cert(ssl);
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003116 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003117# endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003118
3119 /* Key exchanges not involving ephemeral keys don't use
3120 * ServerKeyExchange, so end here. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003121 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003122 ssl->state++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003123 return 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003124 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003125# endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003126
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003127# if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
3128 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003129 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003130 * signature operation, resume signing. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003131 if (ssl->handshake->async_in_progress != 0) {
3132 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3133 ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3134 } else
3135# endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
3136 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003137 {
3138 /* ServerKeyExchange is needed. Prepare the message. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003139 ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
Gilles Peskined3eb0612018-01-08 17:07:44 +01003140 }
3141
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003142 if (ret != 0) {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003143 /* If we're starting to write a new message, set ssl->out_msglen
3144 * to 0. But if we're resuming after an asynchronous message,
3145 * out_msglen is the amount of data written so far and mst be
3146 * preserved. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003147 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS)
3148 MBEDTLS_SSL_DEBUG_MSG(2,
3149 ("<= write server key exchange (pending)"));
Gilles Peskined3eb0612018-01-08 17:07:44 +01003150 else
3151 ssl->out_msglen = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003152 return ret;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003153 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003154
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003155 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003156 * ssl_prepare_server_key_exchange already wrote the signature
3157 * itself at its proper place in the output buffer. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003158# if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
3159 if (signature_len != 0) {
3160 ssl->out_msg[ssl->out_msglen++] = (unsigned char)(signature_len >> 8);
3161 ssl->out_msg[ssl->out_msglen++] = (unsigned char)(signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003162
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003163 MBEDTLS_SSL_DEBUG_BUF(3, "my signature", ssl->out_msg + ssl->out_msglen,
3164 signature_len);
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003165
3166 /* Skip over the already-written signature */
3167 ssl->out_msglen += signature_len;
3168 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003169# endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003170
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003171 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003172 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003173 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003174
3175 ssl->state++;
3176
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003177 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3178 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3179 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003180 }
3181
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003182 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3183 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003184}
3185
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003186static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003187{
Janos Follath865b3eb2019-12-16 11:46:15 +00003188 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003189
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003190 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003191
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003192 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003193 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003194 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003195
3196 ssl->state++;
3197
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003198# if defined(MBEDTLS_SSL_PROTO_DTLS)
3199 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM)
3200 mbedtls_ssl_send_flight_completed(ssl);
3201# endif
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003202
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003203 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3204 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3205 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003206 }
3207
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003208# if defined(MBEDTLS_SSL_PROTO_DTLS)
3209 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3210 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3211 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3212 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003213 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003214# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003215
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003216 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003217
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003218 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003219}
3220
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003221# if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3222 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3223static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl,
3224 unsigned char **p,
3225 const unsigned char *end)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003226{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003227 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003228 size_t n;
3229
3230 /*
3231 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3232 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003233 if (*p + 2 > end) {
3234 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3235 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003236 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003237
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003238 n = ((*p)[0] << 8) | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003239 *p += 2;
3240
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003241 if (*p + n > end) {
3242 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3243 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003244 }
3245
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003246 if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3247 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3248 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003249 }
3250
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003251 *p += n;
3252
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003253 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003254
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003255 return ret;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003256}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003257# endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || \
3258 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003259
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003260# if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3261 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003262
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003263# if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3264static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3265 unsigned char *peer_pms,
3266 size_t *peer_pmslen,
3267 size_t peer_pmssize)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003268{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003269 int ret =
3270 ssl->conf->f_async_resume(ssl, peer_pms, peer_pmslen, peer_pmssize);
3271 if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003272 ssl->handshake->async_in_progress = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003273 mbedtls_ssl_set_async_operation_data(ssl, NULL);
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003274 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003275 MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3276 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003277}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003278# endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003279
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003280static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3281 const unsigned char *p,
3282 const unsigned char *end,
3283 unsigned char *peer_pms,
3284 size_t *peer_pmslen,
3285 size_t peer_pmssize)
Paul Bakker70df2fb2013-04-17 17:19:09 +02003286{
Janos Follath865b3eb2019-12-16 11:46:15 +00003287 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003288 mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3289 mbedtls_pk_context *public_key = &mbedtls_ssl_own_cert(ssl)->pk;
3290 size_t len = mbedtls_pk_get_len(public_key);
Paul Bakker70df2fb2013-04-17 17:19:09 +02003291
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003292# if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003293 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003294 * decryption operation, resume signing. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003295 if (ssl->handshake->async_in_progress != 0) {
3296 MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3297 return (
3298 ssl_resume_decrypt_pms(ssl, peer_pms, peer_pmslen, peer_pmssize));
Paul Bakker70df2fb2013-04-17 17:19:09 +02003299 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003300# endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003301
3302 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003303 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003304 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003305# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3306 if (p + 2 > end) {
3307 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3308 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003309 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003310 if (*p++ != ((len >> 8) & 0xFF) || *p++ != ((len)&0xFF)) {
3311 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3312 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003313 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003314# endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003315
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003316 if (p + len != end) {
3317 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3318 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003319 }
3320
Gilles Peskine422ccab2018-01-11 18:29:01 +01003321 /*
3322 * Decrypt the premaster secret
3323 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003324# if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3325 if (ssl->conf->f_async_decrypt_start != NULL) {
3326 ret = ssl->conf->f_async_decrypt_start(ssl, mbedtls_ssl_own_cert(ssl),
3327 p, len);
3328 switch (ret) {
3329 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3330 /* act as if f_async_decrypt_start was null */
3331 break;
3332 case 0:
3333 ssl->handshake->async_in_progress = 1;
3334 return (ssl_resume_decrypt_pms(ssl, peer_pms, peer_pmslen,
3335 peer_pmssize));
3336 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3337 ssl->handshake->async_in_progress = 1;
3338 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3339 default:
3340 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3341 return ret;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003342 }
3343 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003344# endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003345
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003346 if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3347 MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3348 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003349 }
3350
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003351 ret = mbedtls_pk_decrypt(private_key, p, len, peer_pms, peer_pmslen,
3352 peer_pmssize, ssl->conf->f_rng, ssl->conf->p_rng);
3353 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003354}
3355
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003356static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3357 const unsigned char *p,
3358 const unsigned char *end,
3359 size_t pms_offset)
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003360{
Janos Follath865b3eb2019-12-16 11:46:15 +00003361 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003362 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3363 unsigned char ver[2];
3364 unsigned char fake_pms[48], peer_pms[48];
3365 unsigned char mask;
3366 size_t i, peer_pmslen;
3367 unsigned int diff;
3368
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003369 /* In case of a failure in decryption, the decryption may write less than
3370 * 2 bytes of output, but we always read the first two bytes. It doesn't
3371 * matter in the end because diff will be nonzero in that case due to
André Maroneze79533292020-11-12 09:37:42 +01003372 * ret being nonzero, and we only care whether diff is 0.
3373 * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3374 * also makes memory analyzers happy (don't access uninitialized memory,
3375 * even if it's an unsigned char). */
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003376 peer_pms[0] = peer_pms[1] = ~0;
André Maroneze79533292020-11-12 09:37:42 +01003377 peer_pmslen = 0;
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003378
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003379 ret = ssl_decrypt_encrypted_pms(ssl, p, end, peer_pms, &peer_pmslen,
3380 sizeof(peer_pms));
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003381
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003382# if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3383 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS)
3384 return ret;
3385# endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003386
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003387 mbedtls_ssl_write_version(ssl->handshake->max_major_ver,
3388 ssl->handshake->max_minor_ver,
3389 ssl->conf->transport, ver);
Gilles Peskine2e333372018-04-24 13:22:10 +02003390
3391 /* Avoid data-dependent branches while checking for invalid
3392 * padding, to protect against timing-based Bleichenbacher-type
3393 * attacks. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003394 diff = (unsigned int)ret;
Gilles Peskine2e333372018-04-24 13:22:10 +02003395 diff |= peer_pmslen ^ 48;
3396 diff |= peer_pms[0] ^ ver[0];
3397 diff |= peer_pms[1] ^ ver[1];
3398
3399 /* mask = diff ? 0xff : 0x00 using bit operations to avoid branches */
3400 /* MSVC has a warning about unary minus on unsigned, but this is
3401 * well-defined and precisely what we want to do here */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003402# if defined(_MSC_VER)
3403# pragma warning(push)
3404# pragma warning(disable : 4146)
3405# endif
3406 mask = -((diff | -diff) >> (sizeof(unsigned int) * 8 - 1));
3407# if defined(_MSC_VER)
3408# pragma warning(pop)
3409# endif
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003410
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003411 /*
3412 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3413 * must not cause the connection to end immediately; instead, send a
3414 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003415 * To protect against timing-based variants of the attack, we must
3416 * not have any branch that depends on whether the decryption was
3417 * successful. In particular, always generate the fake premaster secret,
3418 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003419 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003420 ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3421 if (ret != 0) {
Gilles Peskinee1416382018-04-26 10:23:21 +02003422 /* It's ok to abort on an RNG failure, since this does not reveal
3423 * anything about the RSA decryption. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003424 return ret;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003425 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003426
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003427# if defined(MBEDTLS_SSL_DEBUG_ALL)
3428 if (diff != 0)
3429 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3430# endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003431
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003432 if (sizeof(ssl->handshake->premaster) < pms_offset ||
3433 sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3434 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3435 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003436 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003437 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003438
Gilles Peskine422ccab2018-01-11 18:29:01 +01003439 /* Set pms to either the true or the fake PMS, without
3440 * data-dependent branches. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003441 for (i = 0; i < ssl->handshake->pmslen; i++)
3442 pms[i] = (mask & fake_pms[i]) | ((~mask) & peer_pms[i]);
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003443
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003444 return 0;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003445}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003446# endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED || \
3447 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003448
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003449# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
3450static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl,
3451 unsigned char **p,
3452 const unsigned char *end)
Paul Bakkerfbb17802013-04-17 19:10:21 +02003453{
Paul Bakker6db455e2013-09-18 17:29:31 +02003454 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003455 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003456
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003457 if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3458 MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3459 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003460 }
3461
3462 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003463 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003464 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003465 if (end - *p < 2) {
3466 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3467 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003468 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003469
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003470 n = ((*p)[0] << 8) | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003471 *p += 2;
3472
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003473 if (n == 0 || n > end - *p) {
3474 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3475 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003476 }
3477
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003478 if (ssl->conf->f_psk != NULL) {
3479 if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003480 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003481 } else {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003482 /* Identity is not a big secret since clients send it in the clear,
3483 * but treat it carefully anyway, just in case */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003484 if (n != ssl->conf->psk_identity_len ||
3485 mbedtls_ssl_safer_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003486 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003487 }
3488 }
3489
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003490 if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3491 MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3492 mbedtls_ssl_send_alert_message(
3493 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3494 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3495 return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003496 }
3497
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003498 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003499
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003500 return 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003501}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003502# endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003503
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003504static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003505{
Janos Follath865b3eb2019-12-16 11:46:15 +00003506 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003507 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003508 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003509
Hanno Beckere694c3e2017-12-27 21:34:08 +00003510 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003511
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003512 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003513
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003514# if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
3515 (defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3516 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED))
3517 if ((ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3518 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) &&
3519 (ssl->handshake->async_in_progress != 0)) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003520 /* We've already read a record and there is an asynchronous
3521 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003522 * record. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003523 MBEDTLS_SSL_DEBUG_MSG(
3524 3, ("will resume decryption of previously-read record"));
3525 } else
3526# endif
3527 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3528 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3529 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003530 }
3531
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003532 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003533 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003534
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003535 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3536 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3537 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003538 }
3539
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003540 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3541 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3542 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003543 }
3544
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003545# if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
3546 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3547 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3548 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3549 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003550 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003551
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003552 if (p != end) {
3553 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3554 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003555 }
3556
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003557 if ((ret = mbedtls_dhm_calc_secret(
3558 &ssl->handshake->dhm_ctx, ssl->handshake->premaster,
3559 MBEDTLS_PREMASTER_SIZE, &ssl->handshake->pmslen,
3560 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3561 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3562 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003563 }
3564
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003565 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3566 } else
3567# endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
3568# if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3569 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3570 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3571 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
3572 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3573 ciphersuite_info->key_exchange ==
3574 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3575 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
3576 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
3577 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx, p,
3578 end - p)) != 0) {
3579 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3580 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003581 }
3582
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003583 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3584 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003585
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003586 if ((ret = mbedtls_ecdh_calc_secret(
3587 &ssl->handshake->ecdh_ctx, &ssl->handshake->pmslen,
3588 ssl->handshake->premaster, MBEDTLS_MPI_MAX_SIZE,
3589 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3590 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3591 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003592 }
3593
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003594 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3595 MBEDTLS_DEBUG_ECDH_Z);
3596 } else
3597# endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || \
3598 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || \
3599 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || \
3600 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3601# if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
3602 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3603 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3604 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3605 return ret;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003606 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003607
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003608 if (p != end) {
3609 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3610 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003611 }
3612
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003613# if defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Becker845b9462018-10-26 12:07:29 +01003614 /* For opaque PSKs, we perform the PSK-to-MS derivation atomatically
3615 * and skip the intermediate PMS. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003616 if (ssl_use_opaque_psk(ssl) == 1)
3617 MBEDTLS_SSL_DEBUG_MSG(1, ("skip PMS generation for opaque PSK"));
Hanno Becker845b9462018-10-26 12:07:29 +01003618 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003619# endif /* MBEDTLS_USE_PSA_CRYPTO */
3620 if ((ret = mbedtls_ssl_psk_derive_premaster(
3621 ssl, ciphersuite_info->key_exchange)) != 0) {
3622 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3623 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003624 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003625 } else
3626# endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
3627# if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
3628 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
3629# if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3630 if (ssl->handshake->async_in_progress != 0) {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003631 /* There is an asynchronous operation in progress to
3632 * decrypt the encrypted premaster secret, so skip
3633 * directly to resuming this operation. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003634 MBEDTLS_SSL_DEBUG_MSG(3, ("PSK identity already parsed"));
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003635 /* Update p to skip the PSK identity. ssl_parse_encrypted_pms
3636 * won't actually use it, but maintain p anyway for robustness. */
3637 p += ssl->conf->psk_identity_len + 2;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003638 } else
3639# endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3640 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3641 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3642 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003643 }
3644
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003645# if defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Becker845b9462018-10-26 12:07:29 +01003646 /* Opaque PSKs are currently only supported for PSK-only. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003647 if (ssl_use_opaque_psk(ssl) == 1)
3648 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
3649# endif
Hanno Becker845b9462018-10-26 12:07:29 +01003650
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003651 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 2)) != 0) {
3652 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_encrypted_pms"), ret);
3653 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003654 }
3655
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003656 if ((ret = mbedtls_ssl_psk_derive_premaster(
3657 ssl, ciphersuite_info->key_exchange)) != 0) {
3658 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3659 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003660 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003661 } else
3662# endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3663# if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3664 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3665 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3666 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3667 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003668 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003669 if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3670 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3671 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003672 }
3673
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003674# if defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Becker845b9462018-10-26 12:07:29 +01003675 /* Opaque PSKs are currently only supported for PSK-only. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003676 if (ssl_use_opaque_psk(ssl) == 1)
3677 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
3678# endif
Hanno Becker845b9462018-10-26 12:07:29 +01003679
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003680 if (p != end) {
3681 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3682 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003683 }
3684
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003685 if ((ret = mbedtls_ssl_psk_derive_premaster(
3686 ssl, ciphersuite_info->key_exchange)) != 0) {
3687 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3688 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003689 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003690 } else
3691# endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
3692# if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
3693 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
3694 if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3695 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3696 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003697 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003698
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003699 if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx, p,
3700 end - p)) != 0) {
3701 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3702 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003703 }
3704
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003705# if defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Becker845b9462018-10-26 12:07:29 +01003706 /* Opaque PSKs are currently only supported for PSK-only. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003707 if (ssl_use_opaque_psk(ssl) == 1)
3708 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
3709# endif
Hanno Becker845b9462018-10-26 12:07:29 +01003710
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003711 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3712 MBEDTLS_DEBUG_ECDH_QP);
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003713
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003714 if ((ret = mbedtls_ssl_psk_derive_premaster(
3715 ssl, ciphersuite_info->key_exchange)) != 0) {
3716 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3717 return ret;
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003718 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003719 } else
3720# endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
3721# if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
3722 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
3723 if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
3724 MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"),
3725 ret);
3726 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003727 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003728 } else
3729# endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
3730# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
3731 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
3732 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx, p,
3733 end - p);
3734 if (ret != 0) {
3735 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
3736 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003737 }
3738
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003739 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
3740 ssl->handshake->premaster, 32,
3741 &ssl->handshake->pmslen,
3742 ssl->conf->f_rng, ssl->conf->p_rng);
3743 if (ret != 0) {
3744 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
3745 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003746 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003747 } else
3748# endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003749 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003750 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3751 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003752 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003753
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003754 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
3755 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
3756 return ret;
Paul Bakkerff60ee62010-03-16 21:09:09 +00003757 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003758
Paul Bakker5121ce52009-01-03 21:22:43 +00003759 ssl->state++;
3760
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003761 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003762
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003763 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003764}
3765
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003766# if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
3767static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003768{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003769 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003770 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003771
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003772 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003773
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003774 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3775 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02003776 ssl->state++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003777 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02003778 }
3779
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003780 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3781 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003782}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003783# else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
3784static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003785{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003786 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003787 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003788 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003789 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003790 size_t hashlen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003791# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003792 mbedtls_pk_type_t pk_alg;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003793# endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003794 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003795 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003796 ssl->handshake->ciphersuite_info;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003797 mbedtls_pk_context *peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003798
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003799 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003800
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003801 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3802 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003803 ssl->state++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003804 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003805 }
3806
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003807# if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3808 if (ssl->session_negotiate->peer_cert == NULL) {
3809 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00003810 ssl->state++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003811 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003812 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003813# else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3814 if (ssl->session_negotiate->peer_cert_digest == NULL) {
3815 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
Hanno Becker2a831a42019-02-07 13:17:25 +00003816 ssl->state++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003817 return 0;
Hanno Becker2a831a42019-02-07 13:17:25 +00003818 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003819# endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker2a831a42019-02-07 13:17:25 +00003820
Simon Butcher99000142016-10-13 17:21:01 +01003821 /* Read the message without adding it to the checksum */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003822 ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
3823 if (0 != ret) {
3824 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
3825 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003826 }
3827
3828 ssl->state++;
3829
Simon Butcher99000142016-10-13 17:21:01 +01003830 /* Process the message contents */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003831 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
3832 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
3833 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3834 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003835 }
3836
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003837 i = mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00003838
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003839# if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003840 peer_pk = &ssl->handshake->peer_pubkey;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003841# else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3842 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003843 /* Should never happen */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003844 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003845 }
3846 peer_pk = &ssl->session_negotiate->peer_cert->pk;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003847# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Beckera1ab9be2019-02-06 18:31:04 +00003848
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003849 /*
3850 * struct {
3851 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
3852 * opaque signature<0..2^16-1>;
3853 * } DigitallySigned;
3854 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003855# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3856 if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) {
3857 if (i + 2 > ssl->in_hslen) {
3858 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3859 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003860 }
3861
Paul Bakker5121ce52009-01-03 21:22:43 +00003862 /*
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02003863 * Hash
Paul Bakker5121ce52009-01-03 21:22:43 +00003864 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003865 md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
Simon Butcher99000142016-10-13 17:21:01 +01003866
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003867 if (md_alg == MBEDTLS_MD_NONE ||
3868 mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
3869 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3870 " for verify message"));
3871 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Paul Bakker5121ce52009-01-03 21:22:43 +00003872 }
3873
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003874# if !defined(MBEDTLS_MD_SHA1)
3875 if (MBEDTLS_MD_SHA1 == md_alg)
Simon Butcher99000142016-10-13 17:21:01 +01003876 hash_start += 16;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003877# endif
Paul Bakker926af752012-11-23 13:38:07 +01003878
Manuel Pégourié-Gonnardbfe32ef2013-08-22 14:55:30 +02003879 /* Info from md_alg will be used instead */
3880 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003881
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003882 i++;
3883
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003884 /*
3885 * Signature
3886 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003887 if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i])) ==
3888 MBEDTLS_PK_NONE) {
3889 MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
3890 " for verify message"));
3891 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003892 }
3893
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003894 /*
3895 * Check the certificate's key type matches the signature alg
3896 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003897 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
3898 MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
3899 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003900 }
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003901
3902 i++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003903 } else
3904# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02003905 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003906 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3907 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02003908 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02003909
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003910 if (i + 2 > ssl->in_hslen) {
3911 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3912 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00003913 }
3914
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003915 sig_len = (ssl->in_msg[i] << 8) | ssl->in_msg[i + 1];
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003916 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01003917
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003918 if (i + sig_len != ssl->in_hslen) {
3919 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
3920 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00003921 }
3922
Simon Butcher99000142016-10-13 17:21:01 +01003923 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003924 {
3925 size_t dummy_hlen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003926 ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003927 }
Simon Butcher99000142016-10-13 17:21:01 +01003928
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003929 if ((ret = mbedtls_pk_verify(peer_pk, md_alg, hash_start, hashlen,
3930 ssl->in_msg + i, sig_len)) != 0) {
3931 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
3932 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003933 }
3934
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003935 mbedtls_ssl_update_handshake_status(ssl);
Simon Butcher99000142016-10-13 17:21:01 +01003936
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003937 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003938
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003939 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003940}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003941# endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003942
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003943# if defined(MBEDTLS_SSL_SESSION_TICKETS)
3944static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003945{
Janos Follath865b3eb2019-12-16 11:46:15 +00003946 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003947 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02003948 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003949
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003950 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003951
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003952 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003953 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003954
3955 /*
3956 * struct {
3957 * uint32 ticket_lifetime_hint;
3958 * opaque ticket<0..2^16-1>;
3959 * } NewSessionTicket;
3960 *
3961 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
3962 * 8 . 9 ticket_len (n)
3963 * 10 . 9+n ticket content
3964 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02003965
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003966 if ((ret = ssl->conf->f_ticket_write(
3967 ssl->conf->p_ticket, ssl->session_negotiate, ssl->out_msg + 10,
3968 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN, &tlen, &lifetime)) !=
3969 0) {
3970 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003971 tlen = 0;
3972 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003973
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003974 ssl->out_msg[4] = (lifetime >> 24) & 0xFF;
3975 ssl->out_msg[5] = (lifetime >> 16) & 0xFF;
3976 ssl->out_msg[6] = (lifetime >> 8) & 0xFF;
3977 ssl->out_msg[7] = (lifetime)&0xFF;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02003978
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003979 ssl->out_msg[8] = (unsigned char)((tlen >> 8) & 0xFF);
3980 ssl->out_msg[9] = (unsigned char)((tlen)&0xFF);
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003981
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02003982 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003983
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01003984 /*
3985 * Morally equivalent to updating ssl->state, but NewSessionTicket and
3986 * ChangeCipherSpec share the same state.
3987 */
3988 ssl->handshake->new_session_ticket = 0;
3989
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003990 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3991 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3992 return ret;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003993 }
3994
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003995 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003996
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003997 return 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02003998}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003999# endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004000
Paul Bakker5121ce52009-01-03 21:22:43 +00004001/*
Paul Bakker1961b702013-01-25 14:49:24 +01004002 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004003 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004004int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004005{
4006 int ret = 0;
4007
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004008 if (ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL)
4009 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004010
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004011 MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
Paul Bakker1961b702013-01-25 14:49:24 +01004012
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004013 if ((ret = mbedtls_ssl_flush_output(ssl)) != 0)
4014 return ret;
Paul Bakker1961b702013-01-25 14:49:24 +01004015
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004016# if defined(MBEDTLS_SSL_PROTO_DTLS)
4017 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
4018 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING) {
4019 if ((ret = mbedtls_ssl_flight_transmit(ssl)) != 0)
4020 return ret;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02004021 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004022# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02004023
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004024 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004025 case MBEDTLS_SSL_HELLO_REQUEST:
4026 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004027 break;
4028
Paul Bakker1961b702013-01-25 14:49:24 +01004029 /*
4030 * <== ClientHello
4031 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004032 case MBEDTLS_SSL_CLIENT_HELLO:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004033 ret = ssl_parse_client_hello(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00004034 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004035
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004036# if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004037 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004038 return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
4039# endif
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004040
Paul Bakker1961b702013-01-25 14:49:24 +01004041 /*
4042 * ==> ServerHello
4043 * Certificate
4044 * ( ServerKeyExchange )
4045 * ( CertificateRequest )
4046 * ServerHelloDone
4047 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004048 case MBEDTLS_SSL_SERVER_HELLO:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004049 ret = ssl_write_server_hello(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004050 break;
4051
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004052 case MBEDTLS_SSL_SERVER_CERTIFICATE:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004053 ret = mbedtls_ssl_write_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004054 break;
4055
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004056 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004057 ret = ssl_write_server_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004058 break;
4059
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004060 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004061 ret = ssl_write_certificate_request(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004062 break;
4063
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004064 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004065 ret = ssl_write_server_hello_done(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004066 break;
4067
4068 /*
4069 * <== ( Certificate/Alert )
4070 * ClientKeyExchange
4071 * ( CertificateVerify )
4072 * ChangeCipherSpec
4073 * Finished
4074 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004075 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004076 ret = mbedtls_ssl_parse_certificate(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004077 break;
4078
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004079 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004080 ret = ssl_parse_client_key_exchange(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004081 break;
4082
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004083 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004084 ret = ssl_parse_certificate_verify(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004085 break;
4086
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004087 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004088 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004089 break;
4090
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004091 case MBEDTLS_SSL_CLIENT_FINISHED:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004092 ret = mbedtls_ssl_parse_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004093 break;
4094
4095 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004096 * ==> ( NewSessionTicket )
4097 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004098 * Finished
4099 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004100 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004101# if defined(MBEDTLS_SSL_SESSION_TICKETS)
4102 if (ssl->handshake->new_session_ticket != 0)
4103 ret = ssl_write_new_session_ticket(ssl);
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02004104 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004105# endif
4106 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004107 break;
4108
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004109 case MBEDTLS_SSL_SERVER_FINISHED:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004110 ret = mbedtls_ssl_write_finished(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004111 break;
4112
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004113 case MBEDTLS_SSL_FLUSH_BUFFERS:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004114 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004115 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004116 break;
4117
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004118 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004119 mbedtls_ssl_handshake_wrapup(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004120 break;
4121
4122 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004123 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4124 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker5121ce52009-01-03 21:22:43 +00004125 }
4126
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004127 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004128}
TRodziewicz8476f2f2021-06-02 14:34:47 +02004129
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004130void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
TRodziewicz8476f2f2021-06-02 14:34:47 +02004131{
TRodziewicz3946f792021-06-14 12:11:18 +02004132 conf->respect_cli_pref = order;
TRodziewicz8476f2f2021-06-02 14:34:47 +02004133}
4134
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004135#endif /* MBEDTLS_SSL_SRV_C */