blob: 68d3033ced0fc15d4633c697aa4f736aaa34245f [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01002 * TLS client-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_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000023
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020024#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000025#include "mbedtls/platform.h"
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020026#else
Rich Evans00ab4702015-02-06 13:43:58 +000027#include <stdlib.h>
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +020028#define mbedtls_calloc calloc
SimonBd5800b72016-04-26 07:43:27 +010029#define mbedtls_free free
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020030#endif
31
SimonBd5800b72016-04-26 07:43:27 +010032#include "mbedtls/ssl.h"
Chris Jones84a773f2021-03-05 18:38:47 +000033#include "ssl_misc.h"
Janos Follath73c616b2019-12-18 15:07:04 +000034#include "mbedtls/debug.h"
35#include "mbedtls/error.h"
Gabor Mezei765862c2021-10-19 12:22:25 +020036#include "mbedtls/constant_time.h"
SimonBd5800b72016-04-26 07:43:27 +010037
Hanno Beckerbb89e272019-01-08 12:54:37 +000038#if defined(MBEDTLS_USE_PSA_CRYPTO)
39#include "mbedtls/psa_util.h"
40#endif /* MBEDTLS_USE_PSA_CRYPTO */
41
SimonBd5800b72016-04-26 07:43:27 +010042#include <string.h>
43
Manuel Pégourié-Gonnard93866642015-06-22 19:21:23 +020044#include <stdint.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020045
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010047#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020048#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000049
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050051#include "mbedtls/platform_util.h"
Paul Bakker34617722014-06-13 17:20:13 +020052#endif
53
Gilles Peskineeccd8882020-03-10 12:19:08 +010054#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Hanno Becker520224e2018-10-26 11:38:07 +010055static int ssl_conf_has_static_psk( mbedtls_ssl_config const *conf )
Hanno Becker2e4f6162018-10-23 11:54:44 +010056{
57 if( conf->psk_identity == NULL ||
58 conf->psk_identity_len == 0 )
59 {
60 return( 0 );
61 }
62
63 if( conf->psk != NULL && conf->psk_len != 0 )
64 return( 1 );
65
66#if defined(MBEDTLS_USE_PSA_CRYPTO)
Ronald Croncf56a0a2020-08-04 09:51:30 +020067 if( ! mbedtls_svc_key_id_is_null( conf->psk_opaque ) )
Hanno Becker2e4f6162018-10-23 11:54:44 +010068 return( 1 );
69#endif /* MBEDTLS_USE_PSA_CRYPTO */
70
71 return( 0 );
72}
Hanno Beckerdfab8e22018-10-23 11:59:34 +010073
74#if defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Becker520224e2018-10-26 11:38:07 +010075static int ssl_conf_has_static_raw_psk( mbedtls_ssl_config const *conf )
Hanno Beckerdfab8e22018-10-23 11:59:34 +010076{
77 if( conf->psk_identity == NULL ||
78 conf->psk_identity_len == 0 )
79 {
80 return( 0 );
81 }
82
83 if( conf->psk != NULL && conf->psk_len != 0 )
84 return( 1 );
85
86 return( 0 );
87}
88#endif /* MBEDTLS_USE_PSA_CRYPTO */
89
Gilles Peskineeccd8882020-03-10 12:19:08 +010090#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker2e4f6162018-10-23 11:54:44 +010091
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020092#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Xiaofei Bai58afdba2021-11-09 03:10:05 +000093int mbedtls_ssl_write_hostname_ext( mbedtls_ssl_context *ssl,
94 unsigned char *buf,
95 const unsigned char *end,
96 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +010097{
98 unsigned char *p = buf;
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +010099 size_t hostname_len;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100100
101 *olen = 0;
102
Paul Bakker66d5d072014-06-17 16:39:18 +0200103 if( ssl->hostname == NULL )
Hanno Becker261602c2017-04-12 14:54:42 +0100104 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100105
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100106 MBEDTLS_SSL_DEBUG_MSG( 3,
107 ( "client hello, adding server name extension: %s",
108 ssl->hostname ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100109
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100110 hostname_len = strlen( ssl->hostname );
111
Hanno Becker261602c2017-04-12 14:54:42 +0100112 MBEDTLS_SSL_CHK_BUF_PTR( p, end, hostname_len + 9 );
Simon Butchered997662015-09-28 02:14:30 +0100113
Paul Bakkerd3edc862013-03-20 16:07:17 +0100114 /*
Hanno Becker1a9a51c2017-04-07 13:02:16 +0100115 * Sect. 3, RFC 6066 (TLS Extensions Definitions)
116 *
117 * In order to provide any of the server names, clients MAY include an
118 * extension of type "server_name" in the (extended) client hello. The
119 * "extension_data" field of this extension SHALL contain
120 * "ServerNameList" where:
121 *
Paul Bakkerd3edc862013-03-20 16:07:17 +0100122 * struct {
123 * NameType name_type;
124 * select (name_type) {
125 * case host_name: HostName;
126 * } name;
127 * } ServerName;
128 *
129 * enum {
130 * host_name(0), (255)
131 * } NameType;
132 *
133 * opaque HostName<1..2^16-1>;
134 *
135 * struct {
136 * ServerName server_name_list<1..2^16-1>
137 * } ServerNameList;
Hanno Becker1a9a51c2017-04-07 13:02:16 +0100138 *
Paul Bakkerd3edc862013-03-20 16:07:17 +0100139 */
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100140 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SERVERNAME, p, 0 );
141 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100142
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100143 MBEDTLS_PUT_UINT16_BE( hostname_len + 5, p, 0 );
144 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100145
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100146 MBEDTLS_PUT_UINT16_BE( hostname_len + 3, p, 0 );
147 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100148
Joe Subbiani2194dc42021-07-14 12:31:31 +0100149 *p++ = MBEDTLS_BYTE_0( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME );
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100150
151 MBEDTLS_PUT_UINT16_BE( hostname_len, p, 0 );
152 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100153
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100154 memcpy( p, ssl->hostname, hostname_len );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100155
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100156 *olen = hostname_len + 9;
Hanno Becker261602c2017-04-12 14:54:42 +0100157
158 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100159}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200160#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100161
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200162#if defined(MBEDTLS_SSL_RENEGOTIATION)
Hanno Becker261602c2017-04-12 14:54:42 +0100163static int ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,
164 unsigned char *buf,
165 const unsigned char *end,
166 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100167{
168 unsigned char *p = buf;
169
170 *olen = 0;
171
Hanno Becker40f8b512017-10-12 14:58:55 +0100172 /* We're always including an TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the
173 * initial ClientHello, in which case also adding the renegotiation
174 * info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200175 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Hanno Becker261602c2017-04-12 14:54:42 +0100176 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100177
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100178 MBEDTLS_SSL_DEBUG_MSG( 3,
179 ( "client hello, adding renegotiation extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100180
Hanno Becker261602c2017-04-12 14:54:42 +0100181 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 5 + ssl->verify_data_len );
Simon Butchered997662015-09-28 02:14:30 +0100182
Paul Bakkerd3edc862013-03-20 16:07:17 +0100183 /*
184 * Secure renegotiation
185 */
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100186 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0 );
187 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100188
189 *p++ = 0x00;
Joe Subbiani2194dc42021-07-14 12:31:31 +0100190 *p++ = MBEDTLS_BYTE_0( ssl->verify_data_len + 1 );
191 *p++ = MBEDTLS_BYTE_0( ssl->verify_data_len );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100192
193 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
194
195 *olen = 5 + ssl->verify_data_len;
Hanno Becker261602c2017-04-12 14:54:42 +0100196
197 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100198}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200199#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100200
Manuel Pégourié-Gonnardd9423232014-12-02 11:57:29 +0100201/*
202 * Only if we handle at least one key exchange that needs signatures.
203 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200204#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +0100205 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker261602c2017-04-12 14:54:42 +0100206static int ssl_write_signature_algorithms_ext( mbedtls_ssl_context *ssl,
207 unsigned char *buf,
208 const unsigned char *end,
209 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100210{
211 unsigned char *p = buf;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100212 size_t sig_alg_len = 0;
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200213 const int *md;
Hanno Becker261602c2017-04-12 14:54:42 +0100214
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200215#if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5bfd9682014-06-24 15:18:11 +0200216 unsigned char *sig_alg_list = buf + 6;
217#endif
Paul Bakkerd3edc862013-03-20 16:07:17 +0100218
219 *olen = 0;
220
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200221 if( ssl->conf->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Hanno Becker261602c2017-04-12 14:54:42 +0100222 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100223
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100224 MBEDTLS_SSL_DEBUG_MSG( 3,
225 ( "client hello, adding signature_algorithms extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100226
Hanno Beckere131bfe2017-04-12 14:54:42 +0100227 if( ssl->conf->sig_hashes == NULL )
228 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
229
Simon Butchered997662015-09-28 02:14:30 +0100230 for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
231 {
232#if defined(MBEDTLS_ECDSA_C)
233 sig_alg_len += 2;
234#endif
235#if defined(MBEDTLS_RSA_C)
236 sig_alg_len += 2;
237#endif
Hanno Beckere131bfe2017-04-12 14:54:42 +0100238 if( sig_alg_len > MBEDTLS_SSL_MAX_SIG_HASH_ALG_LIST_LEN )
239 {
240 MBEDTLS_SSL_DEBUG_MSG( 3,
241 ( "length in bytes of sig-hash-alg extension too big" ) );
242 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
243 }
Simon Butchered997662015-09-28 02:14:30 +0100244 }
245
Hanno Beckere131bfe2017-04-12 14:54:42 +0100246 /* Empty signature algorithms list, this is a configuration error. */
247 if( sig_alg_len == 0 )
248 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
249
Hanno Becker261602c2017-04-12 14:54:42 +0100250 MBEDTLS_SSL_CHK_BUF_PTR( p, end, sig_alg_len + 6 );
Simon Butchered997662015-09-28 02:14:30 +0100251
Paul Bakkerd3edc862013-03-20 16:07:17 +0100252 /*
253 * Prepare signature_algorithms extension (TLS 1.2)
254 */
Simon Butchered997662015-09-28 02:14:30 +0100255 sig_alg_len = 0;
256
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200257 for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
258 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200259#if defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200260 sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
261 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA;
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200262#endif
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200263#if defined(MBEDTLS_RSA_C)
264 sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
265 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA;
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200266#endif
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200267 }
Paul Bakkerd3edc862013-03-20 16:07:17 +0100268
269 /*
270 * enum {
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200271 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
272 * sha512(6), (255)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100273 * } HashAlgorithm;
274 *
275 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
276 * SignatureAlgorithm;
277 *
278 * struct {
279 * HashAlgorithm hash;
280 * SignatureAlgorithm signature;
281 * } SignatureAndHashAlgorithm;
282 *
283 * SignatureAndHashAlgorithm
284 * supported_signature_algorithms<2..2^16-2>;
285 */
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100286 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SIG_ALG, p, 0 );
287 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100288
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100289 MBEDTLS_PUT_UINT16_BE( sig_alg_len + 2, p, 0 );
290 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100291
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100292 MBEDTLS_PUT_UINT16_BE( sig_alg_len, p, 0 );
293 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100294
Paul Bakkerd3edc862013-03-20 16:07:17 +0100295 *olen = 6 + sig_alg_len;
Hanno Becker261602c2017-04-12 14:54:42 +0100296
297 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100298}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200299#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
Gilles Peskineeccd8882020-03-10 12:19:08 +0100300 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100301
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +0200302#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100303 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker261602c2017-04-12 14:54:42 +0100304static int ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,
305 unsigned char *buf,
306 const unsigned char *end,
307 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100308{
309 unsigned char *p = buf;
Manuel Pégourié-Gonnard8e205fc2014-01-23 17:27:10 +0100310 unsigned char *elliptic_curve_list = p + 6;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100311 size_t elliptic_curve_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200312 const mbedtls_ecp_curve_info *info;
Brett Warren01f3dae2021-08-17 13:50:51 +0100313 const uint16_t *group_list = mbedtls_ssl_get_groups( ssl );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100314 *olen = 0;
315
Brett Warren01f3dae2021-08-17 13:50:51 +0100316 /* Check there is room for header */
317 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
318
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100319 MBEDTLS_SSL_DEBUG_MSG( 3,
320 ( "client hello, adding supported_elliptic_curves extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100321
Brett Warren01f3dae2021-08-17 13:50:51 +0100322 if( group_list == NULL )
Hanno Beckere131bfe2017-04-12 14:54:42 +0100323 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
324
Brett Warren01f3dae2021-08-17 13:50:51 +0100325 for( ; *group_list != 0; group_list++ )
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100326 {
Brett Warren01f3dae2021-08-17 13:50:51 +0100327 info = mbedtls_ecp_curve_info_from_tls_id( *group_list );
Janos Follath8a317052016-04-21 23:37:09 +0100328 if( info == NULL )
329 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100330 MBEDTLS_SSL_DEBUG_MSG( 1,
331 ( "invalid curve in ssl configuration" ) );
Hanno Beckere131bfe2017-04-12 14:54:42 +0100332 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
Janos Follath8a317052016-04-21 23:37:09 +0100333 }
Brett Warren01f3dae2021-08-17 13:50:51 +0100334
335 /* Check there is room for another curve */
336 MBEDTLS_SSL_CHK_BUF_PTR( elliptic_curve_list, end, elliptic_curve_len + 2 );
337
338 MBEDTLS_PUT_UINT16_BE( *group_list, elliptic_curve_list, elliptic_curve_len );
Simon Butchered997662015-09-28 02:14:30 +0100339 elliptic_curve_len += 2;
Hanno Beckere131bfe2017-04-12 14:54:42 +0100340
341 if( elliptic_curve_len > MBEDTLS_SSL_MAX_CURVE_LIST_LEN )
342 {
343 MBEDTLS_SSL_DEBUG_MSG( 3,
344 ( "malformed supported_elliptic_curves extension in config" ) );
345 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
346 }
Simon Butchered997662015-09-28 02:14:30 +0100347 }
348
Hanno Beckere131bfe2017-04-12 14:54:42 +0100349 /* Empty elliptic curve list, this is a configuration error. */
Hanno Becker261602c2017-04-12 14:54:42 +0100350 if( elliptic_curve_len == 0 )
Hanno Beckere131bfe2017-04-12 14:54:42 +0100351 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
Hanno Becker261602c2017-04-12 14:54:42 +0100352
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100353 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES, p, 0 );
354 p += 2;
Simon Butchered997662015-09-28 02:14:30 +0100355
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100356 MBEDTLS_PUT_UINT16_BE( elliptic_curve_len + 2, p, 0 );
357 p += 2;
Simon Butchered997662015-09-28 02:14:30 +0100358
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100359 MBEDTLS_PUT_UINT16_BE( elliptic_curve_len, p, 0 );
360 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100361
Paul Bakkerd3edc862013-03-20 16:07:17 +0100362 *olen = 6 + elliptic_curve_len;
Hanno Becker261602c2017-04-12 14:54:42 +0100363
364 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100365}
366
Hanno Becker261602c2017-04-12 14:54:42 +0100367static int ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
368 unsigned char *buf,
369 const unsigned char *end,
370 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100371{
372 unsigned char *p = buf;
Hanno Becker261602c2017-04-12 14:54:42 +0100373 (void) ssl; /* ssl used for debugging only */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100374
375 *olen = 0;
376
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100377 MBEDTLS_SSL_DEBUG_MSG( 3,
378 ( "client hello, adding supported_point_formats extension" ) );
Hanno Becker261602c2017-04-12 14:54:42 +0100379 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
Simon Butchered997662015-09-28 02:14:30 +0100380
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100381 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0 );
382 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100383
384 *p++ = 0x00;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100385 *p++ = 2;
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200386
387 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200388 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100389
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200390 *olen = 6;
Hanno Becker261602c2017-04-12 14:54:42 +0100391
392 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100393}
Darryl Green11999bb2018-03-13 15:22:58 +0000394#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
Robert Cragieae8535d2015-10-06 17:11:18 +0100395 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100396
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200397#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker261602c2017-04-12 14:54:42 +0100398static int ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
399 unsigned char *buf,
400 const unsigned char *end,
401 size_t *olen )
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200402{
Janos Follath865b3eb2019-12-16 11:46:15 +0000403 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200404 unsigned char *p = buf;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200405 size_t kkpp_len;
406
407 *olen = 0;
408
409 /* Skip costly extension if we can't use EC J-PAKE anyway */
410 if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
Hanno Becker261602c2017-04-12 14:54:42 +0100411 return( 0 );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200412
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100413 MBEDTLS_SSL_DEBUG_MSG( 3,
414 ( "client hello, adding ecjpake_kkpp extension" ) );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200415
Hanno Becker261602c2017-04-12 14:54:42 +0100416 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200417
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100418 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0 );
419 p += 2;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200420
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200421 /*
422 * We may need to send ClientHello multiple times for Hello verification.
423 * We don't want to compute fresh values every time (both for performance
424 * and consistency reasons), so cache the extension content.
425 */
426 if( ssl->handshake->ecjpake_cache == NULL ||
427 ssl->handshake->ecjpake_cache_len == 0 )
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200428 {
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200429 MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) );
430
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +0200431 ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
Hanno Becker261602c2017-04-12 14:54:42 +0100432 p + 2, end - p - 2, &kkpp_len,
433 ssl->conf->f_rng, ssl->conf->p_rng );
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +0200434 if( ret != 0 )
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200435 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100436 MBEDTLS_SSL_DEBUG_RET( 1 ,
437 "mbedtls_ecjpake_write_round_one", ret );
Hanno Becker261602c2017-04-12 14:54:42 +0100438 return( ret );
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200439 }
440
441 ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len );
442 if( ssl->handshake->ecjpake_cache == NULL )
443 {
444 MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) );
Hanno Becker261602c2017-04-12 14:54:42 +0100445 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200446 }
447
448 memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len );
449 ssl->handshake->ecjpake_cache_len = kkpp_len;
450 }
451 else
452 {
453 MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) );
454
455 kkpp_len = ssl->handshake->ecjpake_cache_len;
Hanno Becker261602c2017-04-12 14:54:42 +0100456 MBEDTLS_SSL_CHK_BUF_PTR( p + 2, end, kkpp_len );
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200457
458 memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200459 }
460
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100461 MBEDTLS_PUT_UINT16_BE( kkpp_len, p, 0 );
462 p += 2;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200463
464 *olen = kkpp_len + 4;
Hanno Becker261602c2017-04-12 14:54:42 +0100465
466 return( 0 );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200467}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200468#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000469
Hanno Beckera0e20d02019-05-15 14:03:01 +0100470#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker261602c2017-04-12 14:54:42 +0100471static int ssl_write_cid_ext( mbedtls_ssl_context *ssl,
472 unsigned char *buf,
473 const unsigned char *end,
474 size_t *olen )
Hanno Becker49770ff2019-04-25 16:55:15 +0100475{
476 unsigned char *p = buf;
477 size_t ext_len;
Hanno Becker49770ff2019-04-25 16:55:15 +0100478
479 /*
Hanno Beckerebcc9132019-05-15 10:26:32 +0100480 * Quoting draft-ietf-tls-dtls-connection-id-05
481 * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
Hanno Becker49770ff2019-04-25 16:55:15 +0100482 *
483 * struct {
484 * opaque cid<0..2^8-1>;
485 * } ConnectionId;
486 */
487
488 *olen = 0;
489 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
490 ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED )
491 {
Hanno Becker261602c2017-04-12 14:54:42 +0100492 return( 0 );
Hanno Becker49770ff2019-04-25 16:55:15 +0100493 }
494 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding CID extension" ) );
495
496 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
497 * which is at most 255, so the increment cannot overflow. */
Hanno Becker261602c2017-04-12 14:54:42 +0100498 MBEDTLS_SSL_CHK_BUF_PTR( p, end, (unsigned)( ssl->own_cid_len + 5 ) );
Hanno Becker49770ff2019-04-25 16:55:15 +0100499
500 /* Add extension ID + size */
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100501 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_CID, p, 0 );
502 p += 2;
Hanno Becker49770ff2019-04-25 16:55:15 +0100503 ext_len = (size_t) ssl->own_cid_len + 1;
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100504 MBEDTLS_PUT_UINT16_BE( ext_len, p, 0 );
505 p += 2;
Hanno Becker49770ff2019-04-25 16:55:15 +0100506
507 *p++ = (uint8_t) ssl->own_cid_len;
508 memcpy( p, ssl->own_cid, ssl->own_cid_len );
509
510 *olen = ssl->own_cid_len + 5;
Hanno Becker261602c2017-04-12 14:54:42 +0100511
512 return( 0 );
Hanno Becker49770ff2019-04-25 16:55:15 +0100513}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100514#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker49770ff2019-04-25 16:55:15 +0100515
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200516#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Hanno Becker261602c2017-04-12 14:54:42 +0100517static int ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
518 unsigned char *buf,
519 const unsigned char *end,
520 size_t *olen )
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200521{
522 unsigned char *p = buf;
523
Simon Butcher0fc94e92015-09-28 20:52:04 +0100524 *olen = 0;
525
Hanno Becker261602c2017-04-12 14:54:42 +0100526 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE )
527 return( 0 );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200528
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100529 MBEDTLS_SSL_DEBUG_MSG( 3,
530 ( "client hello, adding max_fragment_length extension" ) );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200531
Hanno Becker261602c2017-04-12 14:54:42 +0100532 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 5 );
Simon Butchered997662015-09-28 02:14:30 +0100533
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100534 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0 );
535 p += 2;
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200536
537 *p++ = 0x00;
538 *p++ = 1;
539
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200540 *p++ = ssl->conf->mfl_code;
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200541
542 *olen = 5;
Hanno Becker261602c2017-04-12 14:54:42 +0100543
544 return( 0 );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200545}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200546#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200547
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200548#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker261602c2017-04-12 14:54:42 +0100549static int ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
550 unsigned char *buf,
551 const unsigned char *end,
552 size_t *olen )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100553{
554 unsigned char *p = buf;
555
Simon Butcher0fc94e92015-09-28 20:52:04 +0100556 *olen = 0;
557
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100558 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED )
Hanno Becker261602c2017-04-12 14:54:42 +0100559 return( 0 );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100560
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100561 MBEDTLS_SSL_DEBUG_MSG( 3,
562 ( "client hello, adding encrypt_then_mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100563
Hanno Becker261602c2017-04-12 14:54:42 +0100564 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Simon Butchered997662015-09-28 02:14:30 +0100565
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100566 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0 );
567 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100568
569 *p++ = 0x00;
570 *p++ = 0x00;
571
572 *olen = 4;
Hanno Becker261602c2017-04-12 14:54:42 +0100573
574 return( 0 );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100575}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200576#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100577
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200578#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Hanno Becker261602c2017-04-12 14:54:42 +0100579static int ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,
580 unsigned char *buf,
581 const unsigned char *end,
582 size_t *olen )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200583{
584 unsigned char *p = buf;
585
Simon Butcher0fc94e92015-09-28 20:52:04 +0100586 *olen = 0;
587
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +0100588 if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED )
Hanno Becker261602c2017-04-12 14:54:42 +0100589 return( 0 );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200590
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100591 MBEDTLS_SSL_DEBUG_MSG( 3,
592 ( "client hello, adding extended_master_secret extension" ) );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200593
Hanno Becker261602c2017-04-12 14:54:42 +0100594 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Simon Butchered997662015-09-28 02:14:30 +0100595
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100596 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0 );
597 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200598
599 *p++ = 0x00;
600 *p++ = 0x00;
601
602 *olen = 4;
Hanno Becker261602c2017-04-12 14:54:42 +0100603
604 return( 0 );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200605}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200606#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200607
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200608#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Hanno Becker261602c2017-04-12 14:54:42 +0100609static int ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,
610 unsigned char *buf,
611 const unsigned char *end,
612 size_t *olen )
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200613{
614 unsigned char *p = buf;
615 size_t tlen = ssl->session_negotiate->ticket_len;
616
Simon Butcher0fc94e92015-09-28 20:52:04 +0100617 *olen = 0;
618
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200619 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED )
Hanno Becker261602c2017-04-12 14:54:42 +0100620 return( 0 );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200621
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100622 MBEDTLS_SSL_DEBUG_MSG( 3,
623 ( "client hello, adding session ticket extension" ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200624
Hanno Becker261602c2017-04-12 14:54:42 +0100625 /* The addition is safe here since the ticket length is 16 bit. */
626 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 + tlen );
Simon Butchered997662015-09-28 02:14:30 +0100627
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100628 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0 );
629 p += 2;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200630
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100631 MBEDTLS_PUT_UINT16_BE( tlen, p, 0 );
632 p += 2;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200633
634 *olen = 4;
635
Simon Butchered997662015-09-28 02:14:30 +0100636 if( ssl->session_negotiate->ticket == NULL || tlen == 0 )
Hanno Becker261602c2017-04-12 14:54:42 +0100637 return( 0 );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200638
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100639 MBEDTLS_SSL_DEBUG_MSG( 3,
Paul Elliottd48d5c62021-01-07 14:47:05 +0000640 ( "sending session ticket of length %" MBEDTLS_PRINTF_SIZET, tlen ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200641
642 memcpy( p, ssl->session_negotiate->ticket, tlen );
643
644 *olen += tlen;
Hanno Becker261602c2017-04-12 14:54:42 +0100645
646 return( 0 );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200647}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200648#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200649
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200650#if defined(MBEDTLS_SSL_ALPN)
Hanno Becker261602c2017-04-12 14:54:42 +0100651static int ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
652 unsigned char *buf,
653 const unsigned char *end,
654 size_t *olen )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200655{
656 unsigned char *p = buf;
Simon Butchered997662015-09-28 02:14:30 +0100657 size_t alpnlen = 0;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200658 const char **cur;
659
Simon Butcher0fc94e92015-09-28 20:52:04 +0100660 *olen = 0;
661
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200662 if( ssl->conf->alpn_list == NULL )
Hanno Becker261602c2017-04-12 14:54:42 +0100663 return( 0 );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200664
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200665 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200666
Simon Butchered997662015-09-28 02:14:30 +0100667 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
Hanno Beckere131bfe2017-04-12 14:54:42 +0100668 alpnlen += strlen( *cur ) + 1;
Simon Butchered997662015-09-28 02:14:30 +0100669
Hanno Becker261602c2017-04-12 14:54:42 +0100670 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 + alpnlen );
Simon Butchered997662015-09-28 02:14:30 +0100671
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100672 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_ALPN, p, 0 );
673 p += 2;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200674
675 /*
676 * opaque ProtocolName<1..2^8-1>;
677 *
678 * struct {
679 * ProtocolName protocol_name_list<2..2^16-1>
680 * } ProtocolNameList;
681 */
682
683 /* Skip writing extension and list length for now */
684 p += 4;
685
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200686 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200687 {
Hanno Beckere131bfe2017-04-12 14:54:42 +0100688 /*
689 * mbedtls_ssl_conf_set_alpn_protocols() checked that the length of
690 * protocol names is less than 255.
691 */
692 *p = (unsigned char)strlen( *cur );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200693 memcpy( p + 1, *cur, *p );
694 p += 1 + *p;
695 }
696
697 *olen = p - buf;
698
699 /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
Joe Subbiani6dd73642021-07-19 11:56:54 +0100700 MBEDTLS_PUT_UINT16_BE( *olen - 6, buf, 4 );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200701
702 /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */
Joe Subbiani6dd73642021-07-19 11:56:54 +0100703 MBEDTLS_PUT_UINT16_BE( *olen - 4, buf, 2 );
Hanno Becker261602c2017-04-12 14:54:42 +0100704
705 return( 0 );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200706}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200707#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200708
Ron Eldora9788042018-12-05 11:04:31 +0200709#if defined(MBEDTLS_SSL_DTLS_SRTP)
Johan Pascal77696ee2020-09-22 21:49:40 +0200710static int ssl_write_use_srtp_ext( mbedtls_ssl_context *ssl,
Johan Pascald387aa02020-09-23 18:47:56 +0200711 unsigned char *buf,
712 const unsigned char *end,
713 size_t *olen )
Johan Pascalb62bb512015-12-03 21:56:45 +0100714{
715 unsigned char *p = buf;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200716 size_t protection_profiles_index = 0, ext_len = 0;
717 uint16_t mki_len = 0, profile_value = 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100718
719 *olen = 0;
720
Johan Pascalc3ccd982020-10-28 17:18:18 +0100721 if( ( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ) ||
722 ( ssl->conf->dtls_srtp_profile_list == NULL ) ||
723 ( ssl->conf->dtls_srtp_profile_list_len == 0 ) )
Johan Pascalb62bb512015-12-03 21:56:45 +0100724 {
Johan Pascal77696ee2020-09-22 21:49:40 +0200725 return( 0 );
Johan Pascalb62bb512015-12-03 21:56:45 +0100726 }
727
Ron Eldora9788042018-12-05 11:04:31 +0200728 /* RFC 5764 section 4.1.1
Johan Pascalb62bb512015-12-03 21:56:45 +0100729 * uint8 SRTPProtectionProfile[2];
730 *
731 * struct {
732 * SRTPProtectionProfiles SRTPProtectionProfiles;
733 * opaque srtp_mki<0..255>;
734 * } UseSRTPData;
Johan Pascalb62bb512015-12-03 21:56:45 +0100735 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100736 */
Johan Pascal9bc97ca2020-09-21 23:44:45 +0200737 if( ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED )
Ron Eldor591f1622018-01-22 12:30:04 +0200738 {
739 mki_len = ssl->dtls_srtp_info.mki_len;
740 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300741 /* Extension length = 2 bytes for profiles length,
742 * ssl->conf->dtls_srtp_profile_list_len * 2 (each profile is 2 bytes length ),
743 * 1 byte for srtp_mki vector length and the mki_len value
744 */
Ron Eldor089c9fe2018-12-06 17:12:49 +0200745 ext_len = 2 + 2 * ( ssl->conf->dtls_srtp_profile_list_len ) + 1 + mki_len;
746
Johan Pascal77696ee2020-09-22 21:49:40 +0200747 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding use_srtp extension" ) );
748
749 /* Check there is room in the buffer for the extension + 4 bytes
750 * - the extension tag (2 bytes)
751 * - the extension length (2 bytes)
752 */
753 MBEDTLS_SSL_CHK_BUF_PTR( p, end, ext_len + 4 );
754
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100755 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_USE_SRTP, p, 0 );
756 p += 2;
Johan Pascal77696ee2020-09-22 21:49:40 +0200757
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100758 MBEDTLS_PUT_UINT16_BE( ext_len, p, 0 );
759 p += 2;
Johan Pascalb62bb512015-12-03 21:56:45 +0100760
Ron Eldor3adb9922017-12-21 10:15:08 +0200761 /* protection profile length: 2*(ssl->conf->dtls_srtp_profile_list_len) */
Johan Pascalaae4d222020-09-22 21:21:39 +0200762 /* micro-optimization:
763 * the list size is limited to MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH
764 * which is lower than 127, so the upper byte of the length is always 0
765 * For the documentation, the more generic code is left in comments
766 * *p++ = (unsigned char)( ( ( 2 * ssl->conf->dtls_srtp_profile_list_len )
767 * >> 8 ) & 0xFF );
768 */
769 *p++ = 0;
Joe Subbiani2194dc42021-07-14 12:31:31 +0100770 *p++ = MBEDTLS_BYTE_0( 2 * ssl->conf->dtls_srtp_profile_list_len );
Johan Pascalb62bb512015-12-03 21:56:45 +0100771
Ron Eldoref72faf2018-07-12 11:54:20 +0300772 for( protection_profiles_index=0;
773 protection_profiles_index < ssl->conf->dtls_srtp_profile_list_len;
774 protection_profiles_index++ )
Johan Pascalb62bb512015-12-03 21:56:45 +0100775 {
Johan Pascal43f94902020-09-22 12:25:52 +0200776 profile_value = mbedtls_ssl_check_srtp_profile_value
Ron Eldor089c9fe2018-12-06 17:12:49 +0200777 ( ssl->conf->dtls_srtp_profile_list[protection_profiles_index] );
Johan Pascal43f94902020-09-22 12:25:52 +0200778 if( profile_value != MBEDTLS_TLS_SRTP_UNSET )
Ron Eldor089c9fe2018-12-06 17:12:49 +0200779 {
780 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_write_use_srtp_ext, add profile: %04x",
781 profile_value ) );
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100782 MBEDTLS_PUT_UINT16_BE( profile_value, p, 0 );
783 p += 2;
Ron Eldor089c9fe2018-12-06 17:12:49 +0200784 }
785 else
786 {
787 /*
788 * Note: we shall never arrive here as protection profiles
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200789 * is checked by mbedtls_ssl_conf_dtls_srtp_protection_profiles function
Ron Eldor089c9fe2018-12-06 17:12:49 +0200790 */
Johan Pascale79c1e82020-09-22 15:51:27 +0200791 MBEDTLS_SSL_DEBUG_MSG( 3,
792 ( "client hello, "
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200793 "illegal DTLS-SRTP protection profile %d",
Johan Pascale79c1e82020-09-22 15:51:27 +0200794 ssl->conf->dtls_srtp_profile_list[protection_profiles_index]
795 ) );
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200796 return( MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED );
Johan Pascalb62bb512015-12-03 21:56:45 +0100797 }
798 }
799
Ron Eldor591f1622018-01-22 12:30:04 +0200800 *p++ = mki_len & 0xFF;
801
802 if( mki_len != 0 )
803 {
Ron Eldor75870ec2018-12-06 17:31:55 +0200804 memcpy( p, ssl->dtls_srtp_info.mki_value, mki_len );
Ron Eldor313d7b52018-12-10 14:56:21 +0200805 /*
806 * Increment p to point to the current position.
807 */
808 p += mki_len;
Ron Eldoref72faf2018-07-12 11:54:20 +0300809 MBEDTLS_SSL_DEBUG_BUF( 3, "sending mki", ssl->dtls_srtp_info.mki_value,
810 ssl->dtls_srtp_info.mki_len );
Ron Eldor591f1622018-01-22 12:30:04 +0200811 }
812
Ron Eldoref72faf2018-07-12 11:54:20 +0300813 /*
814 * total extension length: extension type (2 bytes)
815 * + extension length (2 bytes)
816 * + protection profile length (2 bytes)
817 * + 2 * number of protection profiles
818 * + srtp_mki vector length(1 byte)
Ron Eldor313d7b52018-12-10 14:56:21 +0200819 * + mki value
Ron Eldoref72faf2018-07-12 11:54:20 +0300820 */
Ron Eldor313d7b52018-12-10 14:56:21 +0200821 *olen = p - buf;
Johan Pascal77696ee2020-09-22 21:49:40 +0200822
823 return( 0 );
Johan Pascalb62bb512015-12-03 21:56:45 +0100824}
825#endif /* MBEDTLS_SSL_DTLS_SRTP */
826
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200827/*
828 * Generate random bytes for ClientHello
829 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200830static int ssl_generate_random( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200831{
Janos Follath865b3eb2019-12-16 11:46:15 +0000832 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200833 unsigned char *p = ssl->handshake->randbytes;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200834#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +0100835 mbedtls_time_t t;
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200836#endif
837
Manuel Pégourié-Gonnardfb2d2232014-07-22 15:59:14 +0200838 /*
839 * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1)
840 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200841#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200842 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnardfb2d2232014-07-22 15:59:14 +0200843 ssl->handshake->verify_cookie != NULL )
844 {
845 return( 0 );
846 }
847#endif
848
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200849#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +0100850 t = mbedtls_time( NULL );
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100851 MBEDTLS_PUT_UINT32_BE( t, p, 0 );
852 p += 4;
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200853
Paul Elliottd48d5c62021-01-07 14:47:05 +0000854 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
855 (long long) t ) );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200856#else
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +0100857 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200858 return( ret );
859
860 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861#endif /* MBEDTLS_HAVE_TIME */
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200862
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +0100863 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200864 return( ret );
865
866 return( 0 );
867}
868
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100869/**
870 * \brief Validate cipher suite against config in SSL context.
871 *
872 * \param suite_info cipher suite to validate
873 * \param ssl SSL context
Andrzej Kurek03bac442018-04-25 05:06:07 -0400874 * \param min_minor_ver Minimal minor version to accept a cipher suite
875 * \param max_minor_ver Maximal minor version to accept a cipher suite
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100876 *
877 * \return 0 if valid, else 1
878 */
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100879static int ssl_validate_ciphersuite(
880 const mbedtls_ssl_ciphersuite_t * suite_info,
881 const mbedtls_ssl_context * ssl,
882 int min_minor_ver, int max_minor_ver )
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100883{
Andrzej Kurek03bac442018-04-25 05:06:07 -0400884 (void) ssl;
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100885 if( suite_info == NULL )
886 return( 1 );
887
Andrzej Kurek03bac442018-04-25 05:06:07 -0400888 if( suite_info->min_minor_ver > max_minor_ver ||
889 suite_info->max_minor_ver < min_minor_ver )
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100890 return( 1 );
891
892#if defined(MBEDTLS_SSL_PROTO_DTLS)
893 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
894 ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )
895 return( 1 );
896#endif
897
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100898#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
899 if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
900 mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
901 return( 1 );
902#endif
903
Hanno Becker2e4f6162018-10-23 11:54:44 +0100904 /* Don't suggest PSK-based ciphersuite if no PSK is available. */
Gilles Peskineeccd8882020-03-10 12:19:08 +0100905#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Hanno Becker2e4f6162018-10-23 11:54:44 +0100906 if( mbedtls_ssl_ciphersuite_uses_psk( suite_info ) &&
Hanno Becker520224e2018-10-26 11:38:07 +0100907 ssl_conf_has_static_psk( ssl->conf ) == 0 )
Hanno Becker2e4f6162018-10-23 11:54:44 +0100908 {
909 return( 1 );
910 }
Gilles Peskineeccd8882020-03-10 12:19:08 +0100911#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker2e4f6162018-10-23 11:54:44 +0100912
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100913 return( 0 );
914}
915
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200916static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +0000917{
Janos Follath865b3eb2019-12-16 11:46:15 +0000918 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100919 size_t i, n, olen, ext_len = 0;
Hanno Becker261602c2017-04-12 14:54:42 +0100920
Paul Bakker5121ce52009-01-03 21:22:43 +0000921 unsigned char *buf;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200922 unsigned char *p, *q;
Hanno Becker261602c2017-04-12 14:54:42 +0100923 const unsigned char *end;
924
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200925 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200926 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Ron Eldor755bb6a2018-02-14 19:30:48 +0200927#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
928 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
929 int uses_ec = 0;
930#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000931
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200932 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000933
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +0100934 if( ssl->conf->f_rng == NULL )
Paul Bakkera9a028e2013-11-21 17:31:06 +0100935 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200936 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
937 return( MBEDTLS_ERR_SSL_NO_RNG );
Paul Bakkera9a028e2013-11-21 17:31:06 +0100938 }
939
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200940#if defined(MBEDTLS_SSL_RENEGOTIATION)
941 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100942#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000943 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200944 ssl->major_ver = ssl->conf->min_major_ver;
945 ssl->minor_ver = ssl->conf->min_minor_ver;
Paul Bakker48916f92012-09-16 19:57:18 +0000946 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000947
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +0200948 if( ssl->conf->max_major_ver == 0 )
Paul Bakker490ecc82011-10-06 13:04:09 +0000949 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100950 MBEDTLS_SSL_DEBUG_MSG( 1,
951 ( "configured max major version is invalid, consider using mbedtls_ssl_config_defaults()" ) );
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +0200952 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker490ecc82011-10-06 13:04:09 +0000953 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000954
Hanno Becker261602c2017-04-12 14:54:42 +0100955 buf = ssl->out_msg;
956 end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN;
957
Paul Bakker5121ce52009-01-03 21:22:43 +0000958 /*
Hanno Becker261602c2017-04-12 14:54:42 +0100959 * Check if there's enough space for the first part of the ClientHello
960 * consisting of the 38 bytes described below, the session identifier (at
961 * most 32 bytes) and its length (1 byte).
962 *
963 * Use static upper bounds instead of the actual values
964 * to allow the compiler to optimize this away.
965 */
966 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 38 + 1 + 32 );
967
968 /*
969 * The 38 first bytes of the ClientHello:
970 * 0 . 0 handshake type (written later)
971 * 1 . 3 handshake length (written later)
Paul Bakker5121ce52009-01-03 21:22:43 +0000972 * 4 . 5 highest version supported
973 * 6 . 9 current UNIX time
974 * 10 . 37 random bytes
Hanno Becker261602c2017-04-12 14:54:42 +0100975 *
976 * The current UNIX time (4 bytes) and following 28 random bytes are written
977 * by ssl_generate_random() into ssl->handshake->randbytes buffer and then
978 * copied from there into the output buffer.
Paul Bakker5121ce52009-01-03 21:22:43 +0000979 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000980
Hanno Becker261602c2017-04-12 14:54:42 +0100981 p = buf + 4;
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100982 mbedtls_ssl_write_version( ssl->conf->max_major_ver,
983 ssl->conf->max_minor_ver,
984 ssl->conf->transport, p );
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100985 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000986
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200987 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
Paul Bakker5121ce52009-01-03 21:22:43 +0000988 buf[4], buf[5] ) );
989
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200990 if( ( ret = ssl_generate_random( ssl ) ) != 0 )
991 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200992 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200993 return( ret );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200994 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200995
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200996 memcpy( p, ssl->handshake->randbytes, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200997 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", p, 32 );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200998 p += 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000999
1000 /*
1001 * 38 . 38 session id length
1002 * 39 . 39+n session id
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001003 * 39+n . 39+n DTLS only: cookie length (1 byte)
Hanno Becker261602c2017-04-12 14:54:42 +01001004 * 40+n . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001005 * .. . .. ciphersuitelist length (2 bytes)
1006 * .. . .. ciphersuitelist
1007 * .. . .. compression methods length (1 byte)
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001008 * .. . .. compression methods
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001009 * .. . .. extensions length (2 bytes)
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001010 * .. . .. extensions
Paul Bakker5121ce52009-01-03 21:22:43 +00001011 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001012 n = ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001013
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001014 if( n < 16 || n > 32 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001015#if defined(MBEDTLS_SSL_RENEGOTIATION)
1016 ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001017#endif
Paul Bakker0a597072012-09-25 21:55:46 +00001018 ssl->handshake->resume == 0 )
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +02001019 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001020 n = 0;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +02001021 }
1022
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001023#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +02001024 /*
1025 * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
1026 * generate and include a Session ID in the TLS ClientHello."
1027 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028#if defined(MBEDTLS_SSL_RENEGOTIATION)
1029 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +00001030#endif
Manuel Pégourié-Gonnardd2b35ec2015-03-10 11:40:43 +00001031 {
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +00001032 if( ssl->session_negotiate->ticket != NULL &&
1033 ssl->session_negotiate->ticket_len != 0 )
1034 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001035 ret = ssl->conf->f_rng( ssl->conf->p_rng,
1036 ssl->session_negotiate->id, 32 );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +02001037
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +00001038 if( ret != 0 )
1039 return( ret );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +02001040
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001041 ssl->session_negotiate->id_len = n = 32;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +00001042 }
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +02001043 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001044#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Paul Bakker5121ce52009-01-03 21:22:43 +00001045
Hanno Becker261602c2017-04-12 14:54:42 +01001046 /*
1047 * The first check of the output buffer size above (
1048 * MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 38 + 1 + 32 );)
1049 * has checked that there is enough space in the output buffer for the
1050 * session identifier length byte and the session identifier (n <= 32).
1051 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001052 *p++ = (unsigned char) n;
1053
1054 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +00001055 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +00001056
Paul Elliottd48d5c62021-01-07 14:47:05 +00001057 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001058 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001059
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001060 /*
Hanno Becker261602c2017-04-12 14:54:42 +01001061 * With 'n' being the length of the session identifier
1062 *
1063 * 39+n . 39+n DTLS only: cookie length (1 byte)
1064 * 40+n . .. DTLS only: cookie
1065 * .. . .. ciphersuitelist length (2 bytes)
1066 * .. . .. ciphersuitelist
1067 * .. . .. compression methods length (1 byte)
1068 * .. . .. compression methods
1069 * .. . .. extensions length (2 bytes)
1070 * .. . .. extensions
1071 */
1072
1073 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001074 * DTLS cookie
1075 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001076#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001077 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001078 {
Hanno Becker261602c2017-04-12 14:54:42 +01001079 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 1 );
1080
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001081 if( ssl->handshake->verify_cookie == NULL )
1082 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001083 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no verify cookie to send" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001084 *p++ = 0;
1085 }
1086 else
1087 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001088 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001089 ssl->handshake->verify_cookie,
1090 ssl->handshake->verify_cookie_len );
1091
1092 *p++ = ssl->handshake->verify_cookie_len;
Hanno Becker261602c2017-04-12 14:54:42 +01001093
1094 MBEDTLS_SSL_CHK_BUF_PTR( p, end,
1095 ssl->handshake->verify_cookie_len );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001096 memcpy( p, ssl->handshake->verify_cookie,
1097 ssl->handshake->verify_cookie_len );
1098 p += ssl->handshake->verify_cookie_len;
1099 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001100 }
1101#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001102
Paul Bakker48916f92012-09-16 19:57:18 +00001103 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001104 * Ciphersuite list
Paul Bakker48916f92012-09-16 19:57:18 +00001105 */
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001106 ciphersuites = ssl->conf->ciphersuite_list;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001107
1108 /* Skip writing ciphersuite length for now */
1109 n = 0;
1110 q = p;
Hanno Becker261602c2017-04-12 14:54:42 +01001111
1112 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001113 p += 2;
1114
Paul Bakker2fbefde2013-06-29 16:01:15 +02001115 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +00001116 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001117 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuites[i] );
Paul Bakker2fbefde2013-06-29 16:01:15 +02001118
Andrzej Kurek03bac442018-04-25 05:06:07 -04001119 if( ssl_validate_ciphersuite( ciphersuite_info, ssl,
1120 ssl->conf->min_minor_ver,
1121 ssl->conf->max_minor_ver ) != 0 )
Paul Bakker2fbefde2013-06-29 16:01:15 +02001122 continue;
1123
Hanno Becker3c88c652019-01-02 11:17:25 +00001124 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %#04x (%s)",
Paul Elliott9f352112020-12-09 14:55:45 +00001125 (unsigned int)ciphersuites[i], ciphersuite_info->name ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001126
Ron Eldor755bb6a2018-02-14 19:30:48 +02001127#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
1128 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1129 uses_ec |= mbedtls_ssl_ciphersuite_uses_ec( ciphersuite_info );
1130#endif
1131
Hanno Becker261602c2017-04-12 14:54:42 +01001132 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
1133
Paul Bakker2fbefde2013-06-29 16:01:15 +02001134 n++;
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001135 MBEDTLS_PUT_UINT16_BE( ciphersuites[i], p, 0 );
1136 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00001137 }
1138
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001139 MBEDTLS_SSL_DEBUG_MSG( 3,
Paul Elliottd48d5c62021-01-07 14:47:05 +00001140 ( "client hello, got %" MBEDTLS_PRINTF_SIZET " ciphersuites (excluding SCSVs)", n ) );
Ron Eldor714785d2017-08-28 13:55:55 +03001141
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001142 /*
1143 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1144 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001145#if defined(MBEDTLS_SSL_RENEGOTIATION)
1146 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001147#endif
1148 {
Ron Eldor4a2fb4c2017-09-10 17:03:50 +03001149 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding EMPTY_RENEGOTIATION_INFO_SCSV" ) );
Hanno Becker261602c2017-04-12 14:54:42 +01001150 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001151 MBEDTLS_PUT_UINT16_BE( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO, p, 0 );
1152 p += 2;
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001153 n++;
1154 }
1155
Paul Bakker2fbefde2013-06-29 16:01:15 +02001156 *q++ = (unsigned char)( n >> 7 );
1157 *q++ = (unsigned char)( n << 1 );
1158
Mateusz Starzyka3a99842021-02-19 14:27:22 +01001159 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
1160 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d",
1161 MBEDTLS_SSL_COMPRESS_NULL ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001162
Mateusz Starzyka3a99842021-02-19 14:27:22 +01001163 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
1164 *p++ = 1;
1165 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00001166
Hanno Becker261602c2017-04-12 14:54:42 +01001167 /* First write extensions, then the total length */
1168
1169 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
1170
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001171#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Xiaofei Bai6f435f02021-11-09 04:08:32 +00001172 if( ( ret = mbedtls_ssl_write_hostname_ext( ssl, p + 2 + ext_len,
Xiaofei Baif36e1672021-11-09 09:28:25 +00001173 end, &olen ) ) != 0 )
Hanno Becker261602c2017-04-12 14:54:42 +01001174 {
Xiaofei Bai6f435f02021-11-09 04:08:32 +00001175 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_hostname_ext", ret );
Hanno Becker261602c2017-04-12 14:54:42 +01001176 return( ret );
1177 }
Paul Bakkerd3edc862013-03-20 16:07:17 +01001178 ext_len += olen;
Paul Bakker0be444a2013-08-27 21:55:01 +02001179#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001180
Hanno Becker40f8b512017-10-12 14:58:55 +01001181 /* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added
1182 * even if MBEDTLS_SSL_RENEGOTIATION is not defined. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001183#if defined(MBEDTLS_SSL_RENEGOTIATION)
Hanno Becker261602c2017-04-12 14:54:42 +01001184 if( ( ret = ssl_write_renegotiation_ext( ssl, p + 2 + ext_len,
1185 end, &olen ) ) != 0 )
1186 {
1187 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_renegotiation_ext", ret );
1188 return( ret );
1189 }
Paul Bakkerd3edc862013-03-20 16:07:17 +01001190 ext_len += olen;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001191#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001192
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001193#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001194 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker261602c2017-04-12 14:54:42 +01001195 if( ( ret = ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len,
1196 end, &olen ) ) != 0 )
1197 {
1198 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_signature_algorithms_ext", ret );
1199 return( ret );
1200 }
Paul Bakkerd3edc862013-03-20 16:07:17 +01001201 ext_len += olen;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001202#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001203
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +02001204#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01001205 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Ron Eldor755bb6a2018-02-14 19:30:48 +02001206 if( uses_ec )
1207 {
Hanno Becker261602c2017-04-12 14:54:42 +01001208 if( ( ret = ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len,
1209 end, &olen ) ) != 0 )
1210 {
1211 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_supported_elliptic_curves_ext", ret );
1212 return( ret );
1213 }
Ron Eldor755bb6a2018-02-14 19:30:48 +02001214 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +01001215
Hanno Becker261602c2017-04-12 14:54:42 +01001216 if( ( ret = ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len,
1217 end, &olen ) ) != 0 )
1218 {
1219 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_supported_point_formats_ext", ret );
1220 return( ret );
1221 }
Ron Eldor755bb6a2018-02-14 19:30:48 +02001222 ext_len += olen;
1223 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001224#endif
1225
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02001226#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker261602c2017-04-12 14:54:42 +01001227 if( ( ret = ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len,
1228 end, &olen ) ) != 0 )
1229 {
1230 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_ecjpake_kkpp_ext", ret );
1231 return( ret );
1232 }
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +02001233 ext_len += olen;
1234#endif
1235
Hanno Beckera0e20d02019-05-15 14:03:01 +01001236#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker261602c2017-04-12 14:54:42 +01001237 if( ( ret = ssl_write_cid_ext( ssl, p + 2 + ext_len, end, &olen ) ) != 0 )
1238 {
1239 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_cid_ext", ret );
1240 return( ret );
1241 }
Hanno Becker49770ff2019-04-25 16:55:15 +01001242 ext_len += olen;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001243#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker49770ff2019-04-25 16:55:15 +01001244
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001245#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Hanno Becker261602c2017-04-12 14:54:42 +01001246 if( ( ret = ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len,
1247 end, &olen ) ) != 0 )
1248 {
1249 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_max_fragment_length_ext", ret );
1250 return( ret );
1251 }
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001252 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02001253#endif
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001254
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001255#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker261602c2017-04-12 14:54:42 +01001256 if( ( ret = ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len,
1257 end, &olen ) ) != 0 )
1258 {
1259 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_encrypt_then_mac_ext", ret );
1260 return( ret );
1261 }
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001262 ext_len += olen;
1263#endif
1264
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001265#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Hanno Becker261602c2017-04-12 14:54:42 +01001266 if( ( ret = ssl_write_extended_ms_ext( ssl, p + 2 + ext_len,
1267 end, &olen ) ) != 0 )
1268 {
1269 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_extended_ms_ext", ret );
1270 return( ret );
1271 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001272 ext_len += olen;
1273#endif
1274
Simon Butcher5624ec82015-09-29 01:06:06 +01001275#if defined(MBEDTLS_SSL_ALPN)
Hanno Becker261602c2017-04-12 14:54:42 +01001276 if( ( ret = ssl_write_alpn_ext( ssl, p + 2 + ext_len,
1277 end, &olen ) ) != 0 )
1278 {
1279 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_alpn_ext", ret );
1280 return( ret );
1281 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001282 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02001283#endif
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001284
Johan Pascalb62bb512015-12-03 21:56:45 +01001285#if defined(MBEDTLS_SSL_DTLS_SRTP)
Johan Pascalc3ccd982020-10-28 17:18:18 +01001286 if( ( ret = ssl_write_use_srtp_ext( ssl, p + 2 + ext_len,
1287 end, &olen ) ) != 0 )
Ron Eldor3adb9922017-12-21 10:15:08 +02001288 {
Johan Pascalc3ccd982020-10-28 17:18:18 +01001289 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_use_srtp_ext", ret );
1290 return( ret );
Ron Eldor3adb9922017-12-21 10:15:08 +02001291 }
Johan Pascalc3ccd982020-10-28 17:18:18 +01001292 ext_len += olen;
Johan Pascalb62bb512015-12-03 21:56:45 +01001293#endif
1294
Simon Butcher5624ec82015-09-29 01:06:06 +01001295#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Hanno Becker261602c2017-04-12 14:54:42 +01001296 if( ( ret = ssl_write_session_ticket_ext( ssl, p + 2 + ext_len,
1297 end, &olen ) ) != 0 )
1298 {
1299 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_session_ticket_ext", ret );
1300 return( ret );
1301 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001302 ext_len += olen;
1303#endif
1304
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001305 /* olen unused if all extensions are disabled */
1306 ((void) olen);
1307
Paul Elliottd48d5c62021-01-07 14:47:05 +00001308 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
Hanno Becker261602c2017-04-12 14:54:42 +01001309 ext_len ) );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001310
Paul Bakkera7036632014-04-30 10:15:38 +02001311 if( ext_len > 0 )
1312 {
Hanno Becker261602c2017-04-12 14:54:42 +01001313 /* No need to check for space here, because the extension
1314 * writing functions already took care of that. */
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01001315 MBEDTLS_PUT_UINT16_BE( ext_len, p, 0 );
Joe Subbiani94180e72021-08-20 16:20:44 +01001316 p += 2 + ext_len;
Paul Bakkera7036632014-04-30 10:15:38 +02001317 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001318
Paul Bakker5121ce52009-01-03 21:22:43 +00001319 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001320 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
1321 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00001322
1323 ssl->state++;
1324
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001325#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001326 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001327 mbedtls_ssl_send_flight_completed( ssl );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02001328#endif
1329
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02001330 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001331 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02001332 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001333 return( ret );
1334 }
1335
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02001336#if defined(MBEDTLS_SSL_PROTO_DTLS)
1337 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
1338 ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
1339 {
1340 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
1341 return( ret );
1342 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01001343#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02001344
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001345 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001346
1347 return( 0 );
1348}
1349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001350static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001351 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +00001352 size_t len )
1353{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001354#if defined(MBEDTLS_SSL_RENEGOTIATION)
1355 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00001356 {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001357 /* Check verify-data in constant-time. The length OTOH is no secret */
Paul Bakker48916f92012-09-16 19:57:18 +00001358 if( len != 1 + ssl->verify_data_len * 2 ||
1359 buf[0] != ssl->verify_data_len * 2 ||
Gabor Mezei90437e32021-10-20 11:59:27 +02001360 mbedtls_ct_memcmp( buf + 1,
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001361 ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
Gabor Mezei90437e32021-10-20 11:59:27 +02001362 mbedtls_ct_memcmp( buf + 1 + ssl->verify_data_len,
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001363 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001364 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001365 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001366 mbedtls_ssl_send_alert_message(
1367 ssl,
1368 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1369 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Dave Rodgman43fcb8d2021-06-28 21:49:15 +01001370 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Paul Bakker48916f92012-09-16 19:57:18 +00001371 }
1372 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001373 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001374#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001375 {
1376 if( len != 1 || buf[0] != 0x00 )
1377 {
Ronald Cron5ee57072020-06-11 09:34:06 +02001378 MBEDTLS_SSL_DEBUG_MSG( 1,
1379 ( "non-zero length renegotiation info" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001380 mbedtls_ssl_send_alert_message(
1381 ssl,
1382 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1383 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Dave Rodgman43fcb8d2021-06-28 21:49:15 +01001384 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001385 }
1386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001387 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001388 }
Paul Bakker48916f92012-09-16 19:57:18 +00001389
1390 return( 0 );
1391}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001393#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1394static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001395 const unsigned char *buf,
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001396 size_t len )
1397{
1398 /*
1399 * server should use the extension only if we did,
1400 * and if so the server's value should match ours (and len is always 1)
1401 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001402 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ||
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001403 len != 1 ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001404 buf[0] != ssl->conf->mfl_code )
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001405 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001406 MBEDTLS_SSL_DEBUG_MSG( 1,
1407 ( "non-matching max fragment length extension" ) );
1408 mbedtls_ssl_send_alert_message(
1409 ssl,
1410 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Hanno Beckerc3411d42021-06-24 11:09:00 +01001411 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
1412 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001413 }
1414
1415 return( 0 );
1416}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001417#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Paul Bakker48916f92012-09-16 19:57:18 +00001418
Hanno Beckera0e20d02019-05-15 14:03:01 +01001419#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckera8373a12019-04-26 15:37:26 +01001420static int ssl_parse_cid_ext( mbedtls_ssl_context *ssl,
1421 const unsigned char *buf,
1422 size_t len )
1423{
1424 size_t peer_cid_len;
1425
1426 if( /* CID extension only makes sense in DTLS */
1427 ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
1428 /* The server must only send the CID extension if we have offered it. */
Hanno Becker22626482019-05-03 12:46:59 +01001429 ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED )
Hanno Beckera8373a12019-04-26 15:37:26 +01001430 {
Hanno Becker22626482019-05-03 12:46:59 +01001431 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension unexpected" ) );
Hanno Beckera8373a12019-04-26 15:37:26 +01001432 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Dave Rodgman43fcb8d2021-06-28 21:49:15 +01001433 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT );
Dave Rodgman53c86892021-06-29 10:02:06 +01001434 return( MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION );
Hanno Becker22626482019-05-03 12:46:59 +01001435 }
1436
1437 if( len == 0 )
1438 {
1439 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
1440 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Hanno Beckerc3411d42021-06-24 11:09:00 +01001441 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1442 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Hanno Beckera8373a12019-04-26 15:37:26 +01001443 }
1444
1445 peer_cid_len = *buf++;
1446 len--;
1447
1448 if( peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX )
1449 {
Hanno Becker22626482019-05-03 12:46:59 +01001450 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
Hanno Beckera8373a12019-04-26 15:37:26 +01001451 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Hanno Beckerc3411d42021-06-24 11:09:00 +01001452 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
1453 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Hanno Beckera8373a12019-04-26 15:37:26 +01001454 }
1455
1456 if( len != peer_cid_len )
1457 {
Hanno Becker22626482019-05-03 12:46:59 +01001458 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
Hanno Beckera8373a12019-04-26 15:37:26 +01001459 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Hanno Beckerc3411d42021-06-24 11:09:00 +01001460 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1461 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Hanno Beckera8373a12019-04-26 15:37:26 +01001462 }
1463
Hanno Becker5a299902019-05-03 12:47:49 +01001464 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Beckera8373a12019-04-26 15:37:26 +01001465 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
1466 memcpy( ssl->handshake->peer_cid, buf, peer_cid_len );
1467
1468 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use of CID extension negotiated" ) );
1469 MBEDTLS_SSL_DEBUG_BUF( 3, "Server CID", buf, peer_cid_len );
1470
Hanno Beckera8373a12019-04-26 15:37:26 +01001471 return( 0 );
1472}
Hanno Beckera0e20d02019-05-15 14:03:01 +01001473#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera8373a12019-04-26 15:37:26 +01001474
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001475#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1476static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001477 const unsigned char *buf,
1478 size_t len )
1479{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001480 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001481 len != 0 )
1482 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001483 MBEDTLS_SSL_DEBUG_MSG( 1,
1484 ( "non-matching encrypt-then-MAC extension" ) );
1485 mbedtls_ssl_send_alert_message(
1486 ssl,
1487 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Dave Rodgman43fcb8d2021-06-28 21:49:15 +01001488 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT );
Dave Rodgman53c86892021-06-29 10:02:06 +01001489 return( MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001490 }
1491
1492 ((void) buf);
1493
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001494 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001495
1496 return( 0 );
1497}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001498#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001499
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001500#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1501static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001502 const unsigned char *buf,
1503 size_t len )
1504{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001505 if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001506 len != 0 )
1507 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001508 MBEDTLS_SSL_DEBUG_MSG( 1,
1509 ( "non-matching extended master secret extension" ) );
1510 mbedtls_ssl_send_alert_message(
1511 ssl,
1512 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Dave Rodgmanbed89272021-06-29 12:06:32 +01001513 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT );
1514 return( MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001515 }
1516
1517 ((void) buf);
1518
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001519 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001520
1521 return( 0 );
1522}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001523#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001524
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001525#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1526static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001527 const unsigned char *buf,
1528 size_t len )
1529{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001530 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ||
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02001531 len != 0 )
1532 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001533 MBEDTLS_SSL_DEBUG_MSG( 1,
1534 ( "non-matching session ticket extension" ) );
1535 mbedtls_ssl_send_alert_message(
1536 ssl,
1537 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Dave Rodgmanbed89272021-06-29 12:06:32 +01001538 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT );
1539 return( MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02001540 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001541
1542 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02001543
1544 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001545
1546 return( 0 );
1547}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001548#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001549
Robert Cragie136884c2015-10-02 13:34:31 +01001550#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01001551 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001552static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001553 const unsigned char *buf,
1554 size_t len )
1555{
1556 size_t list_size;
1557 const unsigned char *p;
1558
Philippe Antoine747fd532018-05-30 09:13:21 +02001559 if( len == 0 || (size_t)( buf[0] + 1 ) != len )
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001560 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001561 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001562 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1563 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckerc3411d42021-06-24 11:09:00 +01001564 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001565 }
Philippe Antoine747fd532018-05-30 09:13:21 +02001566 list_size = buf[0];
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001567
Manuel Pégourié-Gonnardfd35af12014-06-23 14:10:13 +02001568 p = buf + 1;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001569 while( list_size > 0 )
1570 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001571 if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
1572 p[0] == MBEDTLS_ECP_PF_COMPRESSED )
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001573 {
Robert Cragie136884c2015-10-02 13:34:31 +01001574#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +02001575 ssl->handshake->ecdh_ctx.point_format = p[0];
Gilles Peskine064a85c2017-05-10 10:46:40 +02001576#endif
Robert Cragieae8535d2015-10-06 17:11:18 +01001577#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskinecd07e222021-05-27 23:17:34 +02001578 mbedtls_ecjpake_set_point_format( &ssl->handshake->ecjpake_ctx,
1579 p[0] );
Robert Cragie136884c2015-10-02 13:34:31 +01001580#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001581 MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001582 return( 0 );
1583 }
1584
1585 list_size--;
1586 p++;
1587 }
1588
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001589 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001590 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1591 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Hanno Beckerc3411d42021-06-24 11:09:00 +01001592 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001593}
Darryl Green11999bb2018-03-13 15:22:58 +00001594#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
Robert Cragieae8535d2015-10-06 17:11:18 +01001595 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001596
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001597#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1598static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
1599 const unsigned char *buf,
1600 size_t len )
1601{
Janos Follath865b3eb2019-12-16 11:46:15 +00001602 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001603
Hanno Beckere694c3e2017-12-27 21:34:08 +00001604 if( ssl->handshake->ciphersuite_info->key_exchange !=
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001605 MBEDTLS_KEY_EXCHANGE_ECJPAKE )
1606 {
1607 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
1608 return( 0 );
1609 }
1610
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +02001611 /* If we got here, we no longer need our cached extension */
1612 mbedtls_free( ssl->handshake->ecjpake_cache );
1613 ssl->handshake->ecjpake_cache = NULL;
1614 ssl->handshake->ecjpake_cache_len = 0;
1615
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001616 if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
1617 buf, len ) ) != 0 )
1618 {
1619 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001620 mbedtls_ssl_send_alert_message(
1621 ssl,
1622 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1623 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001624 return( ret );
1625 }
1626
1627 return( 0 );
1628}
1629#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001630
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001631#if defined(MBEDTLS_SSL_ALPN)
1632static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001633 const unsigned char *buf, size_t len )
1634{
1635 size_t list_len, name_len;
1636 const char **p;
1637
1638 /* If we didn't send it, the server shouldn't send it */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001639 if( ssl->conf->alpn_list == NULL )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001640 {
1641 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching ALPN extension" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001642 mbedtls_ssl_send_alert_message(
1643 ssl,
1644 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Dave Rodgmanbed89272021-06-29 12:06:32 +01001645 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT );
1646 return( MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001647 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001648
1649 /*
1650 * opaque ProtocolName<1..2^8-1>;
1651 *
1652 * struct {
1653 * ProtocolName protocol_name_list<2..2^16-1>
1654 * } ProtocolNameList;
1655 *
1656 * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
1657 */
1658
1659 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
1660 if( len < 4 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001661 {
1662 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1663 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckerc3411d42021-06-24 11:09:00 +01001664 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001665 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001666
1667 list_len = ( buf[0] << 8 ) | buf[1];
1668 if( list_len != len - 2 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001669 {
1670 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1671 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckerc3411d42021-06-24 11:09:00 +01001672 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001673 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001674
1675 name_len = buf[2];
1676 if( name_len != list_len - 1 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001677 {
1678 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1679 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckerc3411d42021-06-24 11:09:00 +01001680 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001681 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001682
1683 /* Check that the server chosen protocol was in our list and save it */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001684 for( p = ssl->conf->alpn_list; *p != NULL; p++ )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001685 {
1686 if( name_len == strlen( *p ) &&
1687 memcmp( buf + 3, *p, name_len ) == 0 )
1688 {
1689 ssl->alpn_chosen = *p;
1690 return( 0 );
1691 }
1692 }
1693
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001694 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ALPN extension: no matching protocol" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001695 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1696 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Hanno Beckerc3411d42021-06-24 11:09:00 +01001697 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001698}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001699#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001700
Johan Pascalb62bb512015-12-03 21:56:45 +01001701#if defined(MBEDTLS_SSL_DTLS_SRTP)
1702static int ssl_parse_use_srtp_ext( mbedtls_ssl_context *ssl,
Ron Eldoref72faf2018-07-12 11:54:20 +03001703 const unsigned char *buf,
1704 size_t len )
Johan Pascalb62bb512015-12-03 21:56:45 +01001705{
Johan Pascal43f94902020-09-22 12:25:52 +02001706 mbedtls_ssl_srtp_profile server_protection = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +02001707 size_t i, mki_len = 0;
Johan Pascalb62bb512015-12-03 21:56:45 +01001708 uint16_t server_protection_profile_value = 0;
1709
1710 /* If use_srtp is not configured, just ignore the extension */
Johan Pascalc3ccd982020-10-28 17:18:18 +01001711 if( ( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ) ||
1712 ( ssl->conf->dtls_srtp_profile_list == NULL ) ||
1713 ( ssl->conf->dtls_srtp_profile_list_len == 0 ) )
Johan Pascalb62bb512015-12-03 21:56:45 +01001714 return( 0 );
1715
Ron Eldora9788042018-12-05 11:04:31 +02001716 /* RFC 5764 section 4.1.1
Johan Pascalb62bb512015-12-03 21:56:45 +01001717 * uint8 SRTPProtectionProfile[2];
1718 *
1719 * struct {
1720 * SRTPProtectionProfiles SRTPProtectionProfiles;
1721 * opaque srtp_mki<0..255>;
1722 * } UseSRTPData;
1723
1724 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
1725 *
Johan Pascalb62bb512015-12-03 21:56:45 +01001726 */
Johan Pascalf6417ec2020-09-22 15:15:19 +02001727 if( ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED )
Ron Eldor591f1622018-01-22 12:30:04 +02001728 {
1729 mki_len = ssl->dtls_srtp_info.mki_len;
1730 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001731
Ron Eldoref72faf2018-07-12 11:54:20 +03001732 /*
Johan Pascal76fdf1d2020-10-22 23:31:00 +02001733 * Length is 5 + optional mki_value : one protection profile length (2 bytes)
1734 * + protection profile (2 bytes)
1735 * + mki_len(1 byte)
Ron Eldor313d7b52018-12-10 14:56:21 +02001736 * and optional srtp_mki
Ron Eldoref72faf2018-07-12 11:54:20 +03001737 */
Johan Pascaladbd9442020-10-26 21:24:25 +01001738 if( ( len < 5 ) || ( len != ( buf[4] + 5u ) ) )
Hanno Beckerc3411d42021-06-24 11:09:00 +01001739 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Johan Pascalb62bb512015-12-03 21:56:45 +01001740
1741 /*
1742 * get the server protection profile
1743 */
Ron Eldoref72faf2018-07-12 11:54:20 +03001744
1745 /*
1746 * protection profile length must be 0x0002 as we must have only
1747 * one protection profile in server Hello
1748 */
Ron Eldor089c9fe2018-12-06 17:12:49 +02001749 if( ( buf[0] != 0 ) || ( buf[1] != 2 ) )
Hanno Beckerc3411d42021-06-24 11:09:00 +01001750 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Ron Eldor089c9fe2018-12-06 17:12:49 +02001751
1752 server_protection_profile_value = ( buf[2] << 8 ) | buf[3];
Johan Pascal43f94902020-09-22 12:25:52 +02001753 server_protection = mbedtls_ssl_check_srtp_profile_value(
1754 server_protection_profile_value );
1755 if( server_protection != MBEDTLS_TLS_SRTP_UNSET )
Ron Eldoref72faf2018-07-12 11:54:20 +03001756 {
Johan Pascal43f94902020-09-22 12:25:52 +02001757 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found srtp profile: %s",
1758 mbedtls_ssl_get_srtp_profile_as_string(
1759 server_protection ) ) );
Johan Pascalb62bb512015-12-03 21:56:45 +01001760 }
1761
Johan Pascal43f94902020-09-22 12:25:52 +02001762 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +02001763
Johan Pascalb62bb512015-12-03 21:56:45 +01001764 /*
1765 * Check we have the server profile in our list
1766 */
Ron Eldor3adb9922017-12-21 10:15:08 +02001767 for( i=0; i < ssl->conf->dtls_srtp_profile_list_len; i++)
Johan Pascalb62bb512015-12-03 21:56:45 +01001768 {
Johan Pascal5ef72d22020-10-28 17:05:47 +01001769 if( server_protection == ssl->conf->dtls_srtp_profile_list[i] )
1770 {
Ron Eldor3adb9922017-12-21 10:15:08 +02001771 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Johan Pascal43f94902020-09-22 12:25:52 +02001772 MBEDTLS_SSL_DEBUG_MSG( 3, ( "selected srtp profile: %s",
1773 mbedtls_ssl_get_srtp_profile_as_string(
1774 server_protection ) ) );
Ron Eldor591f1622018-01-22 12:30:04 +02001775 break;
Johan Pascalb62bb512015-12-03 21:56:45 +01001776 }
1777 }
1778
Ron Eldor591f1622018-01-22 12:30:04 +02001779 /* If no match was found : server problem, it shall never answer with incompatible profile */
Johan Pascal43f94902020-09-22 12:25:52 +02001780 if( ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET )
Ron Eldor591f1622018-01-22 12:30:04 +02001781 {
1782 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Ron Eldoref72faf2018-07-12 11:54:20 +03001783 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Hanno Beckerc3411d42021-06-24 11:09:00 +01001784 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Ron Eldor591f1622018-01-22 12:30:04 +02001785 }
Johan Pascal20c7db32020-10-26 22:45:58 +01001786
1787 /* If server does not use mki in its reply, make sure the client won't keep
1788 * one as negotiated */
1789 if( len == 5 )
1790 {
1791 ssl->dtls_srtp_info.mki_len = 0;
1792 }
1793
Ron Eldoref72faf2018-07-12 11:54:20 +03001794 /*
1795 * RFC5764:
Ron Eldor591f1622018-01-22 12:30:04 +02001796 * If the client detects a nonzero-length MKI in the server's response
1797 * that is different than the one the client offered, then the client
1798 * MUST abort the handshake and SHOULD send an invalid_parameter alert.
1799 */
Ron Eldor313d7b52018-12-10 14:56:21 +02001800 if( len > 5 && ( buf[4] != mki_len ||
1801 ( memcmp( ssl->dtls_srtp_info.mki_value, &buf[5], mki_len ) ) ) )
Ron Eldor591f1622018-01-22 12:30:04 +02001802 {
1803 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1804 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Hanno Beckerc3411d42021-06-24 11:09:00 +01001805 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Ron Eldor591f1622018-01-22 12:30:04 +02001806 }
Ron Eldorb4655392018-07-05 18:25:39 +03001807#if defined (MBEDTLS_DEBUG_C)
Ron Eldoref72faf2018-07-12 11:54:20 +03001808 if( len > 5 )
Ron Eldorb4655392018-07-05 18:25:39 +03001809 {
Ron Eldora9788042018-12-05 11:04:31 +02001810 MBEDTLS_SSL_DEBUG_BUF( 3, "received mki", ssl->dtls_srtp_info.mki_value,
1811 ssl->dtls_srtp_info.mki_len );
Ron Eldorb4655392018-07-05 18:25:39 +03001812 }
1813#endif
Ron Eldora9788042018-12-05 11:04:31 +02001814 return( 0 );
Johan Pascalb62bb512015-12-03 21:56:45 +01001815}
1816#endif /* MBEDTLS_SSL_DTLS_SRTP */
1817
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001818/*
1819 * Parse HelloVerifyRequest. Only called after verifying the HS type.
1820 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001821#if defined(MBEDTLS_SSL_PROTO_DTLS)
1822static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001823{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001824 const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001825 int major_ver, minor_ver;
1826 unsigned char cookie_len;
1827
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001828 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001829
Gilles Peskineb64bf062019-09-27 14:02:44 +02001830 /* Check that there is enough room for:
1831 * - 2 bytes of version
1832 * - 1 byte of cookie_len
1833 */
1834 if( mbedtls_ssl_hs_hdr_len( ssl ) + 3 > ssl->in_msglen )
1835 {
1836 MBEDTLS_SSL_DEBUG_MSG( 1,
1837 ( "incoming HelloVerifyRequest message is too short" ) );
1838 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1839 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckerc3411d42021-06-24 11:09:00 +01001840 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Gilles Peskineb64bf062019-09-27 14:02:44 +02001841 }
1842
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001843 /*
1844 * struct {
1845 * ProtocolVersion server_version;
1846 * opaque cookie<0..2^8-1>;
1847 * } HelloVerifyRequest;
1848 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001849 MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001850 mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001851 p += 2;
1852
TRodziewicz2d8800e2021-05-13 19:14:19 +02001853 /*
1854 * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1)
1855 * even is lower than our min version.
1856 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001857 if( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
TRodziewiczb5850c52021-05-13 17:11:23 +02001858 minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001859 major_ver > ssl->conf->max_major_ver ||
1860 minor_ver > ssl->conf->max_minor_ver )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001861 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001862 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server version" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001863
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001864 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1865 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001866
Hanno Beckerbc000442021-06-24 09:18:19 +01001867 return( MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001868 }
1869
1870 cookie_len = *p++;
Andres AG5a87c932016-09-26 14:53:05 +01001871 if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len )
1872 {
1873 MBEDTLS_SSL_DEBUG_MSG( 1,
1874 ( "cookie length does not match incoming message size" ) );
1875 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1876 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckerc3411d42021-06-24 11:09:00 +01001877 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Andres AG5a87c932016-09-26 14:53:05 +01001878 }
Gilles Peskineb51130d2019-09-27 14:00:36 +02001879 MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len );
Andres AG5a87c932016-09-26 14:53:05 +01001880
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001881 mbedtls_free( ssl->handshake->verify_cookie );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001882
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001883 ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001884 if( ssl->handshake->verify_cookie == NULL )
1885 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02001886 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", cookie_len ) );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02001887 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001888 }
1889
1890 memcpy( ssl->handshake->verify_cookie, p, cookie_len );
1891 ssl->handshake->verify_cookie_len = cookie_len;
1892
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02001893 /* Start over at ClientHello */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001894 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
1895 mbedtls_ssl_reset_checksum( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001896
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001897 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001898
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001899 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse hello verify request" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001900
1901 return( 0 );
1902}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001903#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001904
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001905static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001906{
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001907 int ret, i;
Paul Bakker23986e52011-04-24 08:57:21 +00001908 size_t n;
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001909 size_t ext_len;
Paul Bakker48916f92012-09-16 19:57:18 +00001910 unsigned char *buf, *ext;
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001911 unsigned char comp;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001912#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001913 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001914#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001915 int handshake_failure = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001916 const mbedtls_ssl_ciphersuite_t *suite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001917
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001918 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001919
Hanno Becker327c93b2018-08-15 13:56:18 +01001920 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001921 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001922 /* No alert on a read error. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001923 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001924 return( ret );
1925 }
1926
Hanno Becker79594fd2019-05-08 09:38:41 +01001927 buf = ssl->in_msg;
1928
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001929 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001930 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001931#if defined(MBEDTLS_SSL_RENEGOTIATION)
1932 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001933 {
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001934 ssl->renego_records_seen++;
1935
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001936 if( ssl->conf->renego_max_records >= 0 &&
1937 ssl->renego_records_seen > ssl->conf->renego_max_records )
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001938 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001939 MBEDTLS_SSL_DEBUG_MSG( 1,
1940 ( "renegotiation requested, but not honored by server" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001941 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001942 }
1943
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001944 MBEDTLS_SSL_DEBUG_MSG( 1,
1945 ( "non-handshake message during renegotiation" ) );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01001946
1947 ssl->keep_current_message = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001948 return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO );
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001949 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001950#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001951
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001952 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001953 mbedtls_ssl_send_alert_message(
1954 ssl,
1955 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1956 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001957 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001958 }
1959
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001960#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001961 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001962 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001963 if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001964 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001965 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received hello verify request" ) );
1966 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001967 return( ssl_parse_hello_verify_request( ssl ) );
1968 }
1969 else
1970 {
1971 /* We made it through the verification process */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001972 mbedtls_free( ssl->handshake->verify_cookie );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001973 ssl->handshake->verify_cookie = NULL;
1974 ssl->handshake->verify_cookie_len = 0;
1975 }
1976 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001977#endif /* MBEDTLS_SSL_PROTO_DTLS */
Paul Bakker5121ce52009-01-03 21:22:43 +00001978
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001979 if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) ||
1980 buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO )
Paul Bakker5121ce52009-01-03 21:22:43 +00001981 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001982 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001983 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1984 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckerc3411d42021-06-24 11:09:00 +01001985 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +00001986 }
1987
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001988 /*
1989 * 0 . 1 server_version
1990 * 2 . 33 random (maybe including 4 bytes of Unix time)
1991 * 34 . 34 session_id length = n
1992 * 35 . 34+n session_id
1993 * 35+n . 36+n cipher_suite
1994 * 37+n . 37+n compression_method
1995 *
1996 * 38+n . 39+n extensions length (optional)
1997 * 40+n . .. extensions
1998 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001999 buf += mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02002000
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002001 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", buf + 0, 2 );
2002 mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002003 ssl->conf->transport, buf + 0 );
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01002004 ssl->session_negotiate->minor_ver = ssl->minor_ver;
Paul Bakker5121ce52009-01-03 21:22:43 +00002005
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002006 if( ssl->major_ver < ssl->conf->min_major_ver ||
2007 ssl->minor_ver < ssl->conf->min_minor_ver ||
2008 ssl->major_ver > ssl->conf->max_major_ver ||
2009 ssl->minor_ver > ssl->conf->max_minor_ver )
Paul Bakker1d29fb52012-09-28 13:28:45 +00002010 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002011 MBEDTLS_SSL_DEBUG_MSG( 1,
2012 ( "server version out of bounds - min: [%d:%d], server: [%d:%d], max: [%d:%d]",
2013 ssl->conf->min_major_ver,
2014 ssl->conf->min_minor_ver,
2015 ssl->major_ver, ssl->minor_ver,
2016 ssl->conf->max_major_ver,
2017 ssl->conf->max_minor_ver ) );
Paul Bakker1d29fb52012-09-28 13:28:45 +00002018
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002019 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2020 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Paul Bakker1d29fb52012-09-28 13:28:45 +00002021
Hanno Beckerbc000442021-06-24 09:18:19 +01002022 return( MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION );
Paul Bakker1d29fb52012-09-28 13:28:45 +00002023 }
2024
Andres Amaya Garcia6bce9cb2017-09-06 15:33:34 +01002025 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu",
Paul Elliott9f352112020-12-09 14:55:45 +00002026 ( (unsigned long) buf[2] << 24 ) |
2027 ( (unsigned long) buf[3] << 16 ) |
2028 ( (unsigned long) buf[4] << 8 ) |
2029 ( (unsigned long) buf[5] ) ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002030
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02002031 memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002032
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02002033 n = buf[34];
Paul Bakker5121ce52009-01-03 21:22:43 +00002034
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002035 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 2, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002036
Paul Bakker48916f92012-09-16 19:57:18 +00002037 if( n > 32 )
2038 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002039 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002040 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2041 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckerc3411d42021-06-24 11:09:00 +01002042 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Paul Bakker48916f92012-09-16 19:57:18 +00002043 }
2044
Manuel Pégourié-Gonnarda6e5bd52015-07-23 12:14:13 +02002045 if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +00002046 {
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02002047 ext_len = ( ( buf[38 + n] << 8 )
2048 | ( buf[39 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002049
Paul Bakker48916f92012-09-16 19:57:18 +00002050 if( ( ext_len > 0 && ext_len < 4 ) ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002051 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len )
Paul Bakker48916f92012-09-16 19:57:18 +00002052 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002053 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002054 mbedtls_ssl_send_alert_message(
2055 ssl,
2056 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2057 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckerc3411d42021-06-24 11:09:00 +01002058 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Paul Bakker48916f92012-09-16 19:57:18 +00002059 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002060 }
Manuel Pégourié-Gonnarda6e5bd52015-07-23 12:14:13 +02002061 else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n )
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02002062 {
2063 ext_len = 0;
2064 }
2065 else
2066 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002067 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002068 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2069 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckerc3411d42021-06-24 11:09:00 +01002070 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02002071 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002072
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02002073 /* ciphersuite (used later) */
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02002074 i = ( buf[35 + n] << 8 ) | buf[36 + n];
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02002075
2076 /*
2077 * Read and check compression
2078 */
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02002079 comp = buf[37 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +00002080
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02002081 if( comp != MBEDTLS_SSL_COMPRESS_NULL )
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02002082 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002083 MBEDTLS_SSL_DEBUG_MSG( 1,
2084 ( "server hello, bad compression: %d", comp ) );
2085 mbedtls_ssl_send_alert_message(
2086 ssl,
2087 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2088 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002089 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02002090 }
2091
Paul Bakker380da532012-04-18 16:10:25 +00002092 /*
2093 * Initialize update checksum functions
2094 */
Hanno Beckere694c3e2017-12-27 21:34:08 +00002095 ssl->handshake->ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( i );
2096 if( ssl->handshake->ciphersuite_info == NULL )
Paul Bakker68884e32013-01-07 18:20:04 +01002097 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002098 MBEDTLS_SSL_DEBUG_MSG( 1,
Paul Elliott9f352112020-12-09 14:55:45 +00002099 ( "ciphersuite info for %04x not found", (unsigned int)i ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002100 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2101 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002102 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +01002103 }
Paul Bakker380da532012-04-18 16:10:25 +00002104
Hanno Beckere694c3e2017-12-27 21:34:08 +00002105 mbedtls_ssl_optimize_checksum( ssl, ssl->handshake->ciphersuite_info );
Manuel Pégourié-Gonnard3c599f12014-03-10 13:25:07 +01002106
Paul Elliottd48d5c62021-01-07 14:47:05 +00002107 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002108 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 35, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002109
2110 /*
2111 * Check if the session can be resumed
2112 */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002113 if( ssl->handshake->resume == 0 || n == 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002114#if defined(MBEDTLS_SSL_RENEGOTIATION)
2115 ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002116#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002117 ssl->session_negotiate->ciphersuite != i ||
2118 ssl->session_negotiate->compression != comp ||
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002119 ssl->session_negotiate->id_len != n ||
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02002120 memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002121 {
2122 ssl->state++;
Paul Bakker0a597072012-09-25 21:55:46 +00002123 ssl->handshake->resume = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002124#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002125 ssl->session_negotiate->start = mbedtls_time( NULL );
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002126#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002127 ssl->session_negotiate->ciphersuite = i;
2128 ssl->session_negotiate->compression = comp;
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002129 ssl->session_negotiate->id_len = n;
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02002130 memcpy( ssl->session_negotiate->id, buf + 35, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002131 }
2132 else
2133 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002134 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002135
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002136 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Paul Bakkerff60ee62010-03-16 21:09:09 +00002137 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002138 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002139 mbedtls_ssl_send_alert_message(
2140 ssl,
2141 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2142 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Paul Bakkerff60ee62010-03-16 21:09:09 +00002143 return( ret );
2144 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002145 }
2146
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002147 MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +00002148 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002149
Paul Elliott3891caf2020-12-17 18:42:40 +00002150 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", (unsigned) i ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002151 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d",
2152 buf[37 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002153
Andrzej Kurek03bac442018-04-25 05:06:07 -04002154 /*
2155 * Perform cipher suite validation in same way as in ssl_write_client_hello.
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01002156 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002157 i = 0;
2158 while( 1 )
2159 {
Hanno Beckerd60b6c62021-04-29 12:04:11 +01002160 if( ssl->conf->ciphersuite_list[i] == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002161 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002162 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002163 mbedtls_ssl_send_alert_message(
2164 ssl,
2165 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2166 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Hanno Beckerc3411d42021-06-24 11:09:00 +01002167 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Paul Bakker5121ce52009-01-03 21:22:43 +00002168 }
2169
Hanno Beckerd60b6c62021-04-29 12:04:11 +01002170 if( ssl->conf->ciphersuite_list[i++] ==
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002171 ssl->session_negotiate->ciphersuite )
2172 {
Paul Bakker5121ce52009-01-03 21:22:43 +00002173 break;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002174 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002175 }
2176
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002177 suite_info = mbedtls_ssl_ciphersuite_from_id(
2178 ssl->session_negotiate->ciphersuite );
2179 if( ssl_validate_ciphersuite( suite_info, ssl, ssl->minor_ver,
2180 ssl->minor_ver ) != 0 )
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01002181 {
2182 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002183 mbedtls_ssl_send_alert_message(
2184 ssl,
2185 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Hanno Beckerc3411d42021-06-24 11:09:00 +01002186 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
2187 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01002188 }
2189
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002190 MBEDTLS_SSL_DEBUG_MSG( 3,
2191 ( "server hello, chosen ciphersuite: %s", suite_info->name ) );
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01002192
Gilles Peskineeccd8882020-03-10 12:19:08 +01002193#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnardda19f4c2018-06-12 12:40:54 +02002194 if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA &&
2195 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
2196 {
2197 ssl->handshake->ecrs_enabled = 1;
2198 }
2199#endif
2200
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002201 if( comp != MBEDTLS_SSL_COMPRESS_NULL
Paul Bakker2770fbd2012-07-03 13:30:23 +00002202 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002203 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002204 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002205 mbedtls_ssl_send_alert_message(
2206 ssl,
2207 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2208 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Hanno Beckerc3411d42021-06-24 11:09:00 +01002209 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Paul Bakker5121ce52009-01-03 21:22:43 +00002210 }
Paul Bakker48916f92012-09-16 19:57:18 +00002211 ssl->session_negotiate->compression = comp;
Paul Bakker5121ce52009-01-03 21:22:43 +00002212
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02002213 ext = buf + 40 + n;
Paul Bakker48916f92012-09-16 19:57:18 +00002214
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002215 MBEDTLS_SSL_DEBUG_MSG( 2,
Paul Elliottd48d5c62021-01-07 14:47:05 +00002216 ( "server hello, total extension length: %" MBEDTLS_PRINTF_SIZET, ext_len ) );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02002217
Paul Bakker48916f92012-09-16 19:57:18 +00002218 while( ext_len )
2219 {
2220 unsigned int ext_id = ( ( ext[0] << 8 )
2221 | ( ext[1] ) );
2222 unsigned int ext_size = ( ( ext[2] << 8 )
2223 | ( ext[3] ) );
2224
2225 if( ext_size + 4 > ext_len )
2226 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002227 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002228 mbedtls_ssl_send_alert_message(
2229 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2230 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckerc3411d42021-06-24 11:09:00 +01002231 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Paul Bakker48916f92012-09-16 19:57:18 +00002232 }
2233
2234 switch( ext_id )
2235 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002236 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
2237 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
2238#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00002239 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01002240#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002241
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02002242 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4,
2243 ext_size ) ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00002244 return( ret );
2245
2246 break;
2247
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002248#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2249 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002250 MBEDTLS_SSL_DEBUG_MSG( 3,
2251 ( "found max_fragment_length extension" ) );
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02002252
2253 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
2254 ext + 4, ext_size ) ) != 0 )
2255 {
2256 return( ret );
2257 }
2258
2259 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002260#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02002261
Hanno Beckera0e20d02019-05-15 14:03:01 +01002262#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckera8373a12019-04-26 15:37:26 +01002263 case MBEDTLS_TLS_EXT_CID:
2264 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found CID extension" ) );
2265
2266 if( ( ret = ssl_parse_cid_ext( ssl,
2267 ext + 4,
2268 ext_size ) ) != 0 )
2269 {
2270 return( ret );
2271 }
2272
2273 break;
Hanno Beckera0e20d02019-05-15 14:03:01 +01002274#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera8373a12019-04-26 15:37:26 +01002275
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002276#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2277 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
2278 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002279
2280 if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl,
2281 ext + 4, ext_size ) ) != 0 )
2282 {
2283 return( ret );
2284 }
2285
2286 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002287#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002288
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002289#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2290 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002291 MBEDTLS_SSL_DEBUG_MSG( 3,
2292 ( "found extended_master_secret extension" ) );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002293
2294 if( ( ret = ssl_parse_extended_ms_ext( ssl,
2295 ext + 4, ext_size ) ) != 0 )
2296 {
2297 return( ret );
2298 }
2299
2300 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002301#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002302
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002303#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2304 case MBEDTLS_TLS_EXT_SESSION_TICKET:
2305 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02002306
2307 if( ( ret = ssl_parse_session_ticket_ext( ssl,
2308 ext + 4, ext_size ) ) != 0 )
2309 {
2310 return( ret );
2311 }
2312
2313 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002314#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02002315
Robert Cragie136884c2015-10-02 13:34:31 +01002316#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01002317 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002318 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002319 MBEDTLS_SSL_DEBUG_MSG( 3,
2320 ( "found supported_point_formats extension" ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002321
2322 if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
2323 ext + 4, ext_size ) ) != 0 )
2324 {
2325 return( ret );
2326 }
2327
2328 break;
Robert Cragieae8535d2015-10-06 17:11:18 +01002329#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
2330 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002331
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02002332#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2333 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
2334 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) );
2335
2336 if( ( ret = ssl_parse_ecjpake_kkpp( ssl,
2337 ext + 4, ext_size ) ) != 0 )
2338 {
2339 return( ret );
2340 }
2341
2342 break;
2343#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002344
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002345#if defined(MBEDTLS_SSL_ALPN)
2346 case MBEDTLS_TLS_EXT_ALPN:
2347 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002348
Johan Pascal275874b2020-10-27 10:43:53 +01002349 if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 )
2350 return( ret );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002351
2352 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002353#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002354
Johan Pascalb62bb512015-12-03 21:56:45 +01002355#if defined(MBEDTLS_SSL_DTLS_SRTP)
2356 case MBEDTLS_TLS_EXT_USE_SRTP:
2357 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found use_srtp extension" ) );
2358
Johan Pascalc3ccd982020-10-28 17:18:18 +01002359 if( ( ret = ssl_parse_use_srtp_ext( ssl, ext + 4, ext_size ) ) != 0 )
2360 return( ret );
Johan Pascalb62bb512015-12-03 21:56:45 +01002361
2362 break;
2363#endif /* MBEDTLS_SSL_DTLS_SRTP */
2364
Paul Bakker48916f92012-09-16 19:57:18 +00002365 default:
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002366 MBEDTLS_SSL_DEBUG_MSG( 3,
Paul Elliott9f352112020-12-09 14:55:45 +00002367 ( "unknown extension found: %u (ignoring)", ext_id ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002368 }
2369
2370 ext_len -= 4 + ext_size;
2371 ext += 4 + ext_size;
2372
2373 if( ext_len > 0 && ext_len < 4 )
2374 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002375 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerc3411d42021-06-24 11:09:00 +01002376 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Paul Bakker48916f92012-09-16 19:57:18 +00002377 }
2378 }
2379
2380 /*
2381 * Renegotiation security checks
2382 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002383 if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002384 ssl->conf->allow_legacy_renegotiation ==
2385 MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00002386 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002387 MBEDTLS_SSL_DEBUG_MSG( 1,
2388 ( "legacy renegotiation, breaking off handshake" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002389 handshake_failure = 1;
2390 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002391#if defined(MBEDTLS_SSL_RENEGOTIATION)
2392 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2393 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Paul Bakker48916f92012-09-16 19:57:18 +00002394 renegotiation_info_seen == 0 )
2395 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002396 MBEDTLS_SSL_DEBUG_MSG( 1,
2397 ( "renegotiation_info extension missing (secure)" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002398 handshake_failure = 1;
2399 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002400 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2401 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002402 ssl->conf->allow_legacy_renegotiation ==
2403 MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00002404 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002405 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002406 handshake_failure = 1;
2407 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002408 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2409 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002410 renegotiation_info_seen == 1 )
2411 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002412 MBEDTLS_SSL_DEBUG_MSG( 1,
2413 ( "renegotiation_info extension present (legacy)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002414 handshake_failure = 1;
2415 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002416#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002417
2418 if( handshake_failure == 1 )
2419 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002420 mbedtls_ssl_send_alert_message(
2421 ssl,
2422 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2423 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Hanno Beckerc3411d42021-06-24 11:09:00 +01002424 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Paul Bakker48916f92012-09-16 19:57:18 +00002425 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002426
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002427 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002428
2429 return( 0 );
2430}
2431
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002432#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2433 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002434static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl,
2435 unsigned char **p,
Paul Bakker29e1f122013-04-16 13:07:56 +02002436 unsigned char *end )
2437{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002438 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Gilles Peskinee8a2fc82020-12-08 22:46:11 +01002439 size_t dhm_actual_bitlen;
Paul Bakker29e1f122013-04-16 13:07:56 +02002440
Paul Bakker29e1f122013-04-16 13:07:56 +02002441 /*
2442 * Ephemeral DH parameters:
2443 *
2444 * struct {
2445 * opaque dh_p<1..2^16-1>;
2446 * opaque dh_g<1..2^16-1>;
2447 * opaque dh_Ys<1..2^16-1>;
2448 * } ServerDHParams;
2449 */
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002450 if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx,
2451 p, end ) ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002452 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002453 MBEDTLS_SSL_DEBUG_RET( 2, ( "mbedtls_dhm_read_params" ), ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002454 return( ret );
2455 }
2456
Gilles Peskine487bbf62021-05-27 22:17:07 +02002457 dhm_actual_bitlen = mbedtls_dhm_get_bitlen( &ssl->handshake->dhm_ctx );
Gilles Peskinee8a2fc82020-12-08 22:46:11 +01002458 if( dhm_actual_bitlen < ssl->conf->dhm_min_bitlen )
Paul Bakker29e1f122013-04-16 13:07:56 +02002459 {
Paul Elliottd48d5c62021-01-07 14:47:05 +00002460 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHM prime too short: %" MBEDTLS_PRINTF_SIZET " < %u",
Gilles Peskinee8a2fc82020-12-08 22:46:11 +01002461 dhm_actual_bitlen,
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02002462 ssl->conf->dhm_min_bitlen ) );
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01002463 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002464 }
2465
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002466 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
2467 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
2468 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +02002469
2470 return( ret );
2471}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002472#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2473 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002474
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002475#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2476 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2477 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
2478 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2479 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2480static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002481{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002482 const mbedtls_ecp_curve_info *curve_info;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05002483 mbedtls_ecp_group_id grp_id;
2484#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
2485 grp_id = ssl->handshake->ecdh_ctx.grp.id;
2486#else
2487 grp_id = ssl->handshake->ecdh_ctx.grp_id;
2488#endif
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002489
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05002490 curve_info = mbedtls_ecp_curve_info_from_grp_id( grp_id );
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002491 if( curve_info == NULL )
2492 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002493 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2494 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002495 }
2496
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002497 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002498
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02002499#if defined(MBEDTLS_ECP_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05002500 if( mbedtls_ssl_check_curve( ssl, grp_id ) != 0 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002501#else
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002502 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
2503 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002504#endif
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002505 return( -1 );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002506
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05002507 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
2508 MBEDTLS_DEBUG_ECDH_QP );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002509
2510 return( 0 );
2511}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002512#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2513 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2514 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2515 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2516 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002517
Hanno Beckerbb89e272019-01-08 12:54:37 +00002518#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
2519 ( defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2520 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) )
2521static int ssl_parse_server_ecdh_params_psa( mbedtls_ssl_context *ssl,
2522 unsigned char **p,
2523 unsigned char *end )
2524{
2525 uint16_t tls_id;
Gilles Peskine42459802019-12-19 13:31:53 +01002526 size_t ecdh_bits = 0;
Hanno Beckerbb89e272019-01-08 12:54:37 +00002527 uint8_t ecpoint_len;
2528 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
2529
2530 /*
2531 * Parse ECC group
2532 */
2533
2534 if( end - *p < 4 )
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01002535 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Hanno Beckerbb89e272019-01-08 12:54:37 +00002536
2537 /* First byte is curve_type; only named_curve is handled */
2538 if( *(*p)++ != MBEDTLS_ECP_TLS_NAMED_CURVE )
Hanno Becker2fc9a652021-06-24 15:40:11 +01002539 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Hanno Beckerbb89e272019-01-08 12:54:37 +00002540
2541 /* Next two bytes are the namedcurve value */
2542 tls_id = *(*p)++;
2543 tls_id <<= 8;
2544 tls_id |= *(*p)++;
2545
2546 /* Convert EC group to PSA key type. */
Gilles Peskine42459802019-12-19 13:31:53 +01002547 if( ( handshake->ecdh_psa_type =
2548 mbedtls_psa_parse_tls_ecc_group( tls_id, &ecdh_bits ) ) == 0 )
Hanno Beckerbb89e272019-01-08 12:54:37 +00002549 {
Hanno Becker2fc9a652021-06-24 15:40:11 +01002550 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Hanno Beckerbb89e272019-01-08 12:54:37 +00002551 }
Gilles Peskine42459802019-12-19 13:31:53 +01002552 if( ecdh_bits > 0xffff )
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01002553 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Gilles Peskine42459802019-12-19 13:31:53 +01002554 handshake->ecdh_bits = (uint16_t) ecdh_bits;
Hanno Beckerbb89e272019-01-08 12:54:37 +00002555
2556 /*
2557 * Put peer's ECDH public key in the format understood by PSA.
2558 */
2559
2560 ecpoint_len = *(*p)++;
2561 if( (size_t)( end - *p ) < ecpoint_len )
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01002562 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Hanno Beckerbb89e272019-01-08 12:54:37 +00002563
Gilles Peskine42459802019-12-19 13:31:53 +01002564 if( mbedtls_psa_tls_ecpoint_to_psa_ec(
Hanno Beckerbb89e272019-01-08 12:54:37 +00002565 *p, ecpoint_len,
2566 handshake->ecdh_psa_peerkey,
2567 sizeof( handshake->ecdh_psa_peerkey ),
2568 &handshake->ecdh_psa_peerkey_len ) != 0 )
2569 {
2570 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
2571 }
2572
2573 *p += ecpoint_len;
2574 return( 0 );
2575}
2576#endif /* MBEDTLS_USE_PSA_CRYPTO &&
2577 ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2578 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */
2579
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002580#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2581 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2582 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2583static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
Paul Bakker29e1f122013-04-16 13:07:56 +02002584 unsigned char **p,
2585 unsigned char *end )
2586{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002587 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker29e1f122013-04-16 13:07:56 +02002588
Paul Bakker29e1f122013-04-16 13:07:56 +02002589 /*
2590 * Ephemeral ECDH parameters:
2591 *
2592 * struct {
2593 * ECParameters curve_params;
2594 * ECPoint public;
2595 * } ServerECDHParams;
2596 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002597 if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx,
Paul Bakker29e1f122013-04-16 13:07:56 +02002598 (const unsigned char **) p, end ) ) != 0 )
2599 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002600 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_read_params" ), ret );
Gilles Peskineeccd8882020-03-10 12:19:08 +01002601#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard1c1c20e2018-09-12 10:34:43 +02002602 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
2603 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02002604#endif
Paul Bakker29e1f122013-04-16 13:07:56 +02002605 return( ret );
2606 }
2607
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002608 if( ssl_check_server_ecdh_params( ssl ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002609 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002610 MBEDTLS_SSL_DEBUG_MSG( 1,
2611 ( "bad server key exchange message (ECDHE curve)" ) );
Hanno Becker2fc9a652021-06-24 15:40:11 +01002612 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002613 }
2614
Paul Bakker29e1f122013-04-16 13:07:56 +02002615 return( ret );
2616}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002617#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2618 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2619 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002620
Gilles Peskineeccd8882020-03-10 12:19:08 +01002621#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002622static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002623 unsigned char **p,
2624 unsigned char *end )
2625{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002626 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
irwir6527bd62019-09-21 18:51:25 +03002627 uint16_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02002628 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002629
2630 /*
2631 * PSK parameters:
2632 *
2633 * opaque psk_identity_hint<0..2^16-1>;
2634 */
Hanno Becker0c161d12018-10-08 13:40:50 +01002635 if( end - (*p) < 2 )
Krzysztof Stachowiak740b2182018-03-13 11:31:14 +01002636 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002637 MBEDTLS_SSL_DEBUG_MSG( 1,
2638 ( "bad server key exchange message (psk_identity_hint length)" ) );
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01002639 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Krzysztof Stachowiak740b2182018-03-13 11:31:14 +01002640 }
Manuel Pégourié-Gonnard59b9fe22013-10-15 11:55:33 +02002641 len = (*p)[0] << 8 | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002642 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002643
irwir6527bd62019-09-21 18:51:25 +03002644 if( end - (*p) < len )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002645 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002646 MBEDTLS_SSL_DEBUG_MSG( 1,
2647 ( "bad server key exchange message (psk_identity_hint length)" ) );
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01002648 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002649 }
2650
Manuel Pégourié-Gonnard9d624122016-02-22 11:10:14 +01002651 /*
2652 * Note: we currently ignore the PKS identity hint, as we only allow one
2653 * PSK to be provisionned on the client. This could be changed later if
2654 * someone needs that feature.
2655 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002656 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002657 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002658
2659 return( ret );
2660}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002661#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002662
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002663#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
2664 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002665/*
2666 * Generate a pre-master secret and encrypt it with the server's RSA key
2667 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002668static int ssl_write_encrypted_pms( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002669 size_t offset, size_t *olen,
2670 size_t pms_offset )
2671{
Janos Follath865b3eb2019-12-16 11:46:15 +00002672 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01002673 size_t len_bytes = 2;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002674 unsigned char *p = ssl->handshake->premaster + pms_offset;
Hanno Beckerc7d7e292019-02-06 16:49:54 +00002675 mbedtls_pk_context * peer_pk;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002676
Angus Grattond8213d02016-05-25 20:56:48 +10002677 if( offset + len_bytes > MBEDTLS_SSL_OUT_CONTENT_LEN )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02002678 {
2679 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) );
2680 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2681 }
2682
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002683 /*
2684 * Generate (part of) the pre-master as
2685 * struct {
2686 * ProtocolVersion client_version;
2687 * opaque random[46];
2688 * } PreMasterSecret;
2689 */
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002690 mbedtls_ssl_write_version( ssl->conf->max_major_ver,
2691 ssl->conf->max_minor_ver,
2692 ssl->conf->transport, p );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002693
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002694 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p + 2, 46 ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002695 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002696 MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002697 return( ret );
2698 }
2699
2700 ssl->handshake->pmslen = 48;
2701
Hanno Beckerc7d7e292019-02-06 16:49:54 +00002702#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2703 peer_pk = &ssl->handshake->peer_pubkey;
2704#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002705 if( ssl->session_negotiate->peer_cert == NULL )
2706 {
Hanno Becker8273df82019-02-06 17:37:32 +00002707 /* Should never happen */
Hanno Becker62d58ed2019-02-26 11:51:06 +00002708 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Hanno Becker8273df82019-02-06 17:37:32 +00002709 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002710 }
Hanno Beckerc7d7e292019-02-06 16:49:54 +00002711 peer_pk = &ssl->session_negotiate->peer_cert->pk;
2712#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002713
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002714 /*
2715 * Now write it out, encrypted
2716 */
Hanno Beckerc7d7e292019-02-06 16:49:54 +00002717 if( ! mbedtls_pk_can_do( peer_pk, MBEDTLS_PK_RSA ) )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002718 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002719 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
2720 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002721 }
2722
Hanno Beckerc7d7e292019-02-06 16:49:54 +00002723 if( ( ret = mbedtls_pk_encrypt( peer_pk,
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002724 p, ssl->handshake->pmslen,
2725 ssl->out_msg + offset + len_bytes, olen,
Angus Grattond8213d02016-05-25 20:56:48 +10002726 MBEDTLS_SSL_OUT_CONTENT_LEN - offset - len_bytes,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002727 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002728 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002729 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_rsa_pkcs1_encrypt", ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002730 return( ret );
2731 }
2732
TRodziewicz0f82ec62021-05-12 17:49:18 +02002733#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002734 if( len_bytes == 2 )
2735 {
Joe Subbiani6dd73642021-07-19 11:56:54 +01002736 MBEDTLS_PUT_UINT16_BE( *olen, ssl->out_msg, offset );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002737 *olen += 2;
2738 }
2739#endif
2740
Hanno Beckerae553dd2019-02-08 14:06:00 +00002741#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2742 /* We don't need the peer's public key anymore. Free it. */
2743 mbedtls_pk_free( peer_pk );
2744#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002745 return( 0 );
2746}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002747#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
2748 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002749
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002750#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard5c2a7ca2015-10-23 08:48:41 +02002751#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2752 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2753 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002754static int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl,
Paul Bakker29e1f122013-04-16 13:07:56 +02002755 unsigned char **p,
2756 unsigned char *end,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002757 mbedtls_md_type_t *md_alg,
2758 mbedtls_pk_type_t *pk_alg )
Paul Bakker29e1f122013-04-16 13:07:56 +02002759{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02002760 ((void) ssl);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002761 *md_alg = MBEDTLS_MD_NONE;
2762 *pk_alg = MBEDTLS_PK_NONE;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002763
2764 /* Only in TLS 1.2 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002765 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002766 {
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002767 return( 0 );
2768 }
Paul Bakker29e1f122013-04-16 13:07:56 +02002769
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002770 if( (*p) + 2 > end )
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01002771 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Paul Bakker29e1f122013-04-16 13:07:56 +02002772
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002773 /*
2774 * Get hash algorithm
2775 */
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002776 if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) )
2777 == MBEDTLS_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002778 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002779 MBEDTLS_SSL_DEBUG_MSG( 1,
2780 ( "Server used unsupported HashAlgorithm %d", *(p)[0] ) );
Hanno Becker2fc9a652021-06-24 15:40:11 +01002781 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002782 }
2783
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002784 /*
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002785 * Get signature algorithm
2786 */
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002787 if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) )
2788 == MBEDTLS_PK_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002789 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002790 MBEDTLS_SSL_DEBUG_MSG( 1,
2791 ( "server used unsupported SignatureAlgorithm %d", (*p)[1] ) );
Dave Rodgman5f8c18b2021-06-28 11:58:00 +01002792 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002793 }
2794
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02002795 /*
2796 * Check if the hash is acceptable
2797 */
2798 if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 )
2799 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002800 MBEDTLS_SSL_DEBUG_MSG( 1,
2801 ( "server used HashAlgorithm %d that was not offered", *(p)[0] ) );
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01002802 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02002803 }
2804
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002805 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d",
2806 (*p)[1] ) );
2807 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d",
2808 (*p)[0] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02002809 *p += 2;
2810
2811 return( 0 );
2812}
Manuel Pégourié-Gonnard5c2a7ca2015-10-23 08:48:41 +02002813#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2814 MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2815 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002816#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02002817
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002818#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2819 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2820static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002821{
Janos Follath865b3eb2019-12-16 11:46:15 +00002822 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002823 const mbedtls_ecp_keypair *peer_key;
Hanno Beckerbe7f5082019-02-06 17:44:07 +00002824 mbedtls_pk_context * peer_pk;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002825
Hanno Beckerbe7f5082019-02-06 17:44:07 +00002826#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2827 peer_pk = &ssl->handshake->peer_pubkey;
2828#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002829 if( ssl->session_negotiate->peer_cert == NULL )
2830 {
Hanno Becker8273df82019-02-06 17:37:32 +00002831 /* Should never happen */
Hanno Beckerbd5580a2019-02-26 12:36:01 +00002832 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Hanno Becker8273df82019-02-06 17:37:32 +00002833 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002834 }
Hanno Beckerbe7f5082019-02-06 17:44:07 +00002835 peer_pk = &ssl->session_negotiate->peer_cert->pk;
2836#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002837
Hanno Beckerbe7f5082019-02-06 17:44:07 +00002838 if( ! mbedtls_pk_can_do( peer_pk, MBEDTLS_PK_ECKEY ) )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002839 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002840 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
2841 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002842 }
2843
Hanno Beckerbe7f5082019-02-06 17:44:07 +00002844 peer_key = mbedtls_pk_ec( *peer_pk );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002845
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002846 if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,
2847 MBEDTLS_ECDH_THEIRS ) ) != 0 )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002848 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002849 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002850 return( ret );
2851 }
2852
2853 if( ssl_check_server_ecdh_params( ssl ) != 0 )
2854 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002855 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) );
Hanno Becker9ed1ba52021-06-24 11:03:13 +01002856 return( MBEDTLS_ERR_SSL_BAD_CERTIFICATE );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002857 }
2858
Hanno Beckerae553dd2019-02-08 14:06:00 +00002859#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2860 /* We don't need the peer's public key anymore. Free it,
2861 * so that more RAM is available for upcoming expensive
2862 * operations like ECDHE. */
2863 mbedtls_pk_free( peer_pk );
2864#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2865
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002866 return( ret );
2867}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002868#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2869 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002870
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002871static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
Paul Bakker41c83d32013-03-20 14:39:14 +01002872{
Janos Follath865b3eb2019-12-16 11:46:15 +00002873 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002874 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002875 ssl->handshake->ciphersuite_info;
Andres Amaya Garcia53c77cc2017-06-27 16:15:06 +01002876 unsigned char *p = NULL, *end = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00002877
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002878 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002879
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002880#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
2881 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00002882 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002883 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002884 ssl->state++;
2885 return( 0 );
2886 }
Manuel Pégourié-Gonnardbac0e3b2013-10-15 11:54:47 +02002887 ((void) p);
2888 ((void) end);
2889#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002890
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002891#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2892 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2893 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
2894 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002895 {
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002896 if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 )
2897 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002898 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002899 mbedtls_ssl_send_alert_message(
2900 ssl,
2901 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2902 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002903 return( ret );
2904 }
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002905
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002906 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002907 ssl->state++;
2908 return( 0 );
2909 }
2910 ((void) p);
2911 ((void) end);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002912#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2913 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002914
Gilles Peskineeccd8882020-03-10 12:19:08 +01002915#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02002916 if( ssl->handshake->ecrs_enabled &&
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002917 ssl->handshake->ecrs_state == ssl_ecrs_ske_start_processing )
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02002918 {
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002919 goto start_processing;
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02002920 }
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002921#endif
2922
Hanno Becker327c93b2018-08-15 13:56:18 +01002923 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002924 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002925 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002926 return( ret );
2927 }
2928
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002929 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002930 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002931 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002932 mbedtls_ssl_send_alert_message(
2933 ssl,
2934 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2935 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002936 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002937 }
2938
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002939 /*
2940 * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
2941 * doesn't use a psk_identity_hint
2942 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002943 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002944 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002945 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2946 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Paul Bakker188c8de2013-04-19 09:13:37 +02002947 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002948 /* Current message is probably either
2949 * CertificateRequest or ServerHelloDone */
2950 ssl->keep_current_message = 1;
Paul Bakker188c8de2013-04-19 09:13:37 +02002951 goto exit;
2952 }
2953
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002954 MBEDTLS_SSL_DEBUG_MSG( 1,
2955 ( "server key exchange message must not be skipped" ) );
2956 mbedtls_ssl_send_alert_message(
2957 ssl,
2958 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2959 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002960
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002961 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002962 }
2963
Gilles Peskineeccd8882020-03-10 12:19:08 +01002964#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002965 if( ssl->handshake->ecrs_enabled )
2966 ssl->handshake->ecrs_state = ssl_ecrs_ske_start_processing;
2967
2968start_processing:
2969#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002970 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Paul Bakker3b6a07b2013-03-21 11:56:50 +01002971 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002972 MBEDTLS_SSL_DEBUG_BUF( 3, "server key exchange", p, end - p );
Paul Bakker3b6a07b2013-03-21 11:56:50 +01002973
Gilles Peskineeccd8882020-03-10 12:19:08 +01002974#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002975 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2976 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
2977 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2978 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002979 {
2980 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
2981 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002982 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002983 mbedtls_ssl_send_alert_message(
2984 ssl,
2985 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Dave Rodgman8f127392021-06-28 12:02:21 +01002986 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01002987 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002988 }
2989 } /* FALLTROUGH */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002990#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002991
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002992#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \
2993 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
2994 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2995 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002996 ; /* nothing more to do */
2997 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002998#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||
2999 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3000#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3001 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3002 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
3003 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00003004 {
Paul Bakker29e1f122013-04-16 13:07:56 +02003005 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003006 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003007 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003008 mbedtls_ssl_send_alert_message(
3009 ssl,
3010 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3011 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Dave Rodgmanbed89272021-06-29 12:06:32 +01003012 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003013 }
3014 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003015 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003016#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3017 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Hanno Beckerbb89e272019-01-08 12:54:37 +00003018#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
3019 ( defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3020 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) )
3021 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3022 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
3023 {
3024 if( ssl_parse_server_ecdh_params_psa( ssl, &p, end ) != 0 )
3025 {
3026 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003027 mbedtls_ssl_send_alert_message(
3028 ssl,
3029 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3030 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Dave Rodgmanc50b7172021-06-29 14:40:23 +01003031 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Hanno Beckerbb89e272019-01-08 12:54:37 +00003032 }
3033 }
3034 else
3035#endif /* MBEDTLS_USE_PSA_CRYPTO &&
3036 ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3037 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003038#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3039 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
3040 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
3041 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3042 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
3043 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003044 {
3045 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
3046 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003047 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003048 mbedtls_ssl_send_alert_message(
3049 ssl,
3050 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3051 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Dave Rodgman39bd5a62021-06-29 15:25:21 +01003052 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Paul Bakker41c83d32013-03-20 14:39:14 +01003053 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003054 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003055 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003056#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3057 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
3058 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003059#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
3060 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
3061 {
3062 ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
3063 p, end - p );
3064 if( ret != 0 )
3065 {
3066 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003067 mbedtls_ssl_send_alert_message(
3068 ssl,
3069 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Hanno Becker77b4a652021-06-24 16:27:09 +01003070 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
3071 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003072 }
3073 }
3074 else
3075#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01003076 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003077 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3078 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003079 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003080
Gilles Peskineeccd8882020-03-10 12:19:08 +01003081#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Hanno Becker1aa267c2017-04-28 17:08:27 +01003082 if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003083 {
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00003084 size_t sig_len, hashlen;
3085 unsigned char hash[64];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003086 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
3087 mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
3088 unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00003089 size_t params_len = p - params;
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02003090 void *rs_ctx = NULL;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02003091
Hanno Beckera6899bb2019-02-06 18:26:03 +00003092 mbedtls_pk_context * peer_pk;
3093
Paul Bakker29e1f122013-04-16 13:07:56 +02003094 /*
3095 * Handle the digitally-signed structure
3096 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003097#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3098 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003099 {
Paul Bakker9659dae2013-08-28 16:21:34 +02003100 if( ssl_parse_signature_algorithm( ssl, &p, end,
3101 &md_alg, &pk_alg ) != 0 )
3102 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003103 MBEDTLS_SSL_DEBUG_MSG( 1,
3104 ( "bad server key exchange message" ) );
3105 mbedtls_ssl_send_alert_message(
3106 ssl,
3107 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3108 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01003109 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Paul Bakker9659dae2013-08-28 16:21:34 +02003110 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003111
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003112 if( pk_alg !=
3113 mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003114 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003115 MBEDTLS_SSL_DEBUG_MSG( 1,
3116 ( "bad server key exchange message" ) );
3117 mbedtls_ssl_send_alert_message(
3118 ssl,
3119 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3120 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01003121 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003122 }
3123 }
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02003124 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003125#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker9659dae2013-08-28 16:21:34 +02003126 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003127 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3128 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker9659dae2013-08-28 16:21:34 +02003129 }
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003130
3131 /*
3132 * Read signature
3133 */
Krzysztof Stachowiaka1098f82018-03-13 11:28:49 +01003134
3135 if( p > end - 2 )
3136 {
3137 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003138 mbedtls_ssl_send_alert_message(
3139 ssl,
3140 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3141 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01003142 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Krzysztof Stachowiaka1098f82018-03-13 11:28:49 +01003143 }
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02003144 sig_len = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00003145 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003146
Krzysztof Stachowiak027f84c2018-03-13 11:29:24 +01003147 if( p != end - sig_len )
Paul Bakker41c83d32013-03-20 14:39:14 +01003148 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003149 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003150 mbedtls_ssl_send_alert_message(
3151 ssl,
3152 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3153 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Beckercbc8f6f2021-06-24 10:32:31 +01003154 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Paul Bakker41c83d32013-03-20 14:39:14 +01003155 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003156
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003157 MBEDTLS_SSL_DEBUG_BUF( 3, "signature", p, sig_len );
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02003158
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02003159 /*
3160 * Compute the hash that has been signed
3161 */
TRodziewicz0f82ec62021-05-12 17:49:18 +02003162#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003163 if( md_alg != MBEDTLS_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02003164 {
Gilles Peskineca1d7422018-04-24 11:53:22 +02003165 ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, &hashlen,
3166 params, params_len,
3167 md_alg );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01003168 if( ret != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02003169 return( ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02003170 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003171 else
TRodziewicz0f82ec62021-05-12 17:49:18 +02003172#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02003173 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003174 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3175 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02003176 }
Paul Bakker29e1f122013-04-16 13:07:56 +02003177
Gilles Peskineca1d7422018-04-24 11:53:22 +02003178 MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
Paul Bakker29e1f122013-04-16 13:07:56 +02003179
Hanno Beckera6899bb2019-02-06 18:26:03 +00003180#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3181 peer_pk = &ssl->handshake->peer_pubkey;
3182#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02003183 if( ssl->session_negotiate->peer_cert == NULL )
3184 {
Hanno Becker8273df82019-02-06 17:37:32 +00003185 /* Should never happen */
Hanno Beckerbd5580a2019-02-26 12:36:01 +00003186 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Hanno Becker8273df82019-02-06 17:37:32 +00003187 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02003188 }
Hanno Beckera6899bb2019-02-06 18:26:03 +00003189 peer_pk = &ssl->session_negotiate->peer_cert->pk;
3190#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02003191
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02003192 /*
3193 * Verify signature
3194 */
Hanno Beckera6899bb2019-02-06 18:26:03 +00003195 if( !mbedtls_pk_can_do( peer_pk, pk_alg ) )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02003196 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003197 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003198 mbedtls_ssl_send_alert_message(
3199 ssl,
3200 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3201 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003202 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02003203 }
3204
Gilles Peskineeccd8882020-03-10 12:19:08 +01003205#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003206 if( ssl->handshake->ecrs_enabled )
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +02003207 rs_ctx = &ssl->handshake->ecrs_ctx.pk;
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02003208#endif
3209
Hanno Beckera6899bb2019-02-06 18:26:03 +00003210 if( ( ret = mbedtls_pk_verify_restartable( peer_pk,
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02003211 md_alg, hash, hashlen, p, sig_len, rs_ctx ) ) != 0 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02003212 {
Gilles Peskineeccd8882020-03-10 12:19:08 +01003213#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02003214 if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS )
3215#endif
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003216 mbedtls_ssl_send_alert_message(
3217 ssl,
3218 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3219 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003220 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
Gilles Peskineeccd8882020-03-10 12:19:08 +01003221#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02003222 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3223 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3224#endif
Paul Bakkerc70b9822013-04-07 22:00:46 +02003225 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00003226 }
Hanno Beckerae553dd2019-02-08 14:06:00 +00003227
3228#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3229 /* We don't need the peer's public key anymore. Free it,
3230 * so that more RAM is available for upcoming expensive
3231 * operations like ECDHE. */
3232 mbedtls_pk_free( peer_pk );
3233#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Paul Bakker5121ce52009-01-03 21:22:43 +00003234 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003235#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003236
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003237exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00003238 ssl->state++;
3239
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003240 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003241
3242 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003243}
3244
Gilles Peskineeccd8882020-03-10 12:19:08 +01003245#if ! defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003246static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003247{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003248 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003249 ssl->handshake->ciphersuite_info;
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003250
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003251 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003252
Hanno Becker1aa267c2017-04-28 17:08:27 +01003253 if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003254 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003255 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003256 ssl->state++;
3257 return( 0 );
3258 }
3259
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003260 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3261 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003262}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003263#else /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003264static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003265{
Janos Follath865b3eb2019-12-16 11:46:15 +00003266 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003267 unsigned char *buf;
3268 size_t n = 0;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003269 size_t cert_type_len = 0, dn_len = 0;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003270 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003271 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003272
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003273 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003274
Hanno Becker1aa267c2017-04-28 17:08:27 +01003275 if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003276 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003277 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003278 ssl->state++;
3279 return( 0 );
3280 }
3281
Hanno Becker327c93b2018-08-15 13:56:18 +01003282 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003283 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003284 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3285 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003286 }
3287
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003288 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
3289 {
3290 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003291 mbedtls_ssl_send_alert_message(
3292 ssl,
3293 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3294 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003295 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
3296 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003297
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003298 ssl->state++;
3299 ssl->client_auth = ( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST );
Paul Bakker5121ce52009-01-03 21:22:43 +00003300
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003301 MBEDTLS_SSL_DEBUG_MSG( 3, ( "got %s certificate request",
Paul Bakker5121ce52009-01-03 21:22:43 +00003302 ssl->client_auth ? "a" : "no" ) );
3303
Paul Bakker926af752012-11-23 13:38:07 +01003304 if( ssl->client_auth == 0 )
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003305 {
Johan Pascala89ca862020-08-25 10:03:19 +02003306 /* Current message is probably the ServerHelloDone */
3307 ssl->keep_current_message = 1;
Paul Bakker926af752012-11-23 13:38:07 +01003308 goto exit;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003309 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003310
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02003311 /*
3312 * struct {
3313 * ClientCertificateType certificate_types<1..2^8-1>;
3314 * SignatureAndHashAlgorithm
3315 * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only
3316 * DistinguishedName certificate_authorities<0..2^16-1>;
3317 * } CertificateRequest;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003318 *
3319 * Since we only support a single certificate on clients, let's just
3320 * ignore all the information that's supposed to help us pick a
3321 * certificate.
3322 *
3323 * We could check that our certificate matches the request, and bail out
3324 * if it doesn't, but it's simpler to just send the certificate anyway,
3325 * and give the server the opportunity to decide if it should terminate
3326 * the connection when it doesn't like our certificate.
3327 *
3328 * Same goes for the hash in TLS 1.2's signature_algorithms: at this
3329 * point we only have one hash available (see comments in
Simon Butcherc0957bd2016-03-01 13:16:57 +00003330 * write_certificate_verify), so let's just use what we have.
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003331 *
3332 * However, we still minimally parse the message to check it is at least
3333 * superficially sane.
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02003334 */
Paul Bakker926af752012-11-23 13:38:07 +01003335 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02003336
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003337 /* certificate_types */
Krzysztof Stachowiak73b183c2018-04-05 10:20:09 +02003338 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) )
3339 {
3340 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
3341 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3342 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Becker5697af02021-06-24 10:33:51 +01003343 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Krzysztof Stachowiak73b183c2018-04-05 10:20:09 +02003344 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003345 cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )];
Paul Bakker926af752012-11-23 13:38:07 +01003346 n = cert_type_len;
3347
Krzysztof Stachowiakbc145f72018-03-20 11:19:50 +01003348 /*
Krzysztof Stachowiak94d49972018-04-05 14:48:55 +02003349 * In the subsequent code there are two paths that read from buf:
Krzysztof Stachowiakbc145f72018-03-20 11:19:50 +01003350 * * the length of the signature algorithms field (if minor version of
3351 * SSL is 3),
3352 * * distinguished name length otherwise.
3353 * Both reach at most the index:
3354 * ...hdr_len + 2 + n,
3355 * therefore the buffer length at this point must be greater than that
3356 * regardless of the actual code path.
3357 */
3358 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
Paul Bakker926af752012-11-23 13:38:07 +01003359 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003360 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003361 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3362 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Becker5697af02021-06-24 10:33:51 +01003363 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Paul Bakker926af752012-11-23 13:38:07 +01003364 }
3365
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003366 /* supported_signature_algorithms */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003367#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3368 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01003369 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003370 size_t sig_alg_len =
3371 ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
3372 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
Simon Butcher99000142016-10-13 17:21:01 +01003373#if defined(MBEDTLS_DEBUG_C)
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003374 unsigned char* sig_alg;
Simon Butcher99000142016-10-13 17:21:01 +01003375 size_t i;
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003376#endif
Simon Butcher99000142016-10-13 17:21:01 +01003377
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003378 /*
Krzysztof Stachowiak94d49972018-04-05 14:48:55 +02003379 * The furthest access in buf is in the loop few lines below:
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003380 * sig_alg[i + 1],
3381 * where:
3382 * sig_alg = buf + ...hdr_len + 3 + n,
3383 * max(i) = sig_alg_len - 1.
Krzysztof Stachowiak94d49972018-04-05 14:48:55 +02003384 * Therefore the furthest access is:
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003385 * buf[...hdr_len + 3 + n + sig_alg_len - 1 + 1],
3386 * which reduces to:
3387 * buf[...hdr_len + 3 + n + sig_alg_len],
3388 * which is one less than we need the buf to be.
3389 */
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003390 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl )
3391 + 3 + n + sig_alg_len )
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003392 {
3393 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003394 mbedtls_ssl_send_alert_message(
3395 ssl,
3396 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3397 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Becker5697af02021-06-24 10:33:51 +01003398 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003399 }
3400
3401#if defined(MBEDTLS_DEBUG_C)
3402 sig_alg = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n;
Simon Butcher99000142016-10-13 17:21:01 +01003403 for( i = 0; i < sig_alg_len; i += 2 )
3404 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003405 MBEDTLS_SSL_DEBUG_MSG( 3,
3406 ( "Supported Signature Algorithm found: %d,%d",
3407 sig_alg[i], sig_alg[i + 1] ) );
Simon Butcher99000142016-10-13 17:21:01 +01003408 }
3409#endif
Paul Bakker926af752012-11-23 13:38:07 +01003410
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003411 n += 2 + sig_alg_len;
Paul Bakkerf7abd422013-04-16 13:15:56 +02003412 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003413#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker926af752012-11-23 13:38:07 +01003414
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003415 /* certificate_authorities */
3416 dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
3417 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01003418
3419 n += dn_len;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003420 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n )
Paul Bakker926af752012-11-23 13:38:07 +01003421 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003422 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003423 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3424 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Becker5697af02021-06-24 10:33:51 +01003425 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Paul Bakker926af752012-11-23 13:38:07 +01003426 }
3427
3428exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003429 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003430
3431 return( 0 );
3432}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003433#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003434
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003435static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003436{
Janos Follath865b3eb2019-12-16 11:46:15 +00003437 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003438
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003439 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003440
Hanno Becker327c93b2018-08-15 13:56:18 +01003441 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003442 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003443 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3444 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003445 }
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003446
3447 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
3448 {
3449 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
3450 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
3451 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003452
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003453 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ||
3454 ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003455 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003456 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003457 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3458 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Becker029cc2f2021-06-24 10:09:50 +01003459 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +00003460 }
3461
3462 ssl->state++;
3463
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003464#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003465 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003466 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003467#endif
3468
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003469 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003470
3471 return( 0 );
3472}
3473
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003474static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003475{
Janos Follath865b3eb2019-12-16 11:46:15 +00003476 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003477
3478 size_t header_len;
3479 size_t content_len;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003480 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003481 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003482
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003483 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003484
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003485#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
3486 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003487 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003488 /*
3489 * DHM key exchange -- send G^X mod P
3490 */
Gilles Peskine487bbf62021-05-27 22:17:07 +02003491 content_len = mbedtls_dhm_get_len( &ssl->handshake->dhm_ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00003492
Joe Subbiani6dd73642021-07-19 11:56:54 +01003493 MBEDTLS_PUT_UINT16_BE( content_len, ssl->out_msg, 4 );
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003494 header_len = 6;
Paul Bakker5121ce52009-01-03 21:22:43 +00003495
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003496 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
Gilles Peskine487bbf62021-05-27 22:17:07 +02003497 (int) mbedtls_dhm_get_len( &ssl->handshake->dhm_ctx ),
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003498 &ssl->out_msg[header_len], content_len,
3499 ssl->conf->f_rng, ssl->conf->p_rng );
Paul Bakker5121ce52009-01-03 21:22:43 +00003500 if( ret != 0 )
3501 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003502 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003503 return( ret );
3504 }
3505
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003506 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
3507 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00003508
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003509 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003510 ssl->handshake->premaster,
3511 MBEDTLS_PREMASTER_SIZE,
3512 &ssl->handshake->pmslen,
3513 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003514 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003515 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003516 return( ret );
3517 }
3518
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003519 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00003520 }
3521 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003522#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Hanno Becker4a63ed42019-01-08 11:39:35 +00003523#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
3524 ( defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3525 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) )
3526 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3527 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
3528 {
3529 psa_status_t status;
Janos Follath53b8ec22019-08-08 10:28:27 +01003530 psa_key_attributes_t key_attributes;
Hanno Becker4a63ed42019-01-08 11:39:35 +00003531
3532 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3533
3534 unsigned char own_pubkey[MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH];
3535 size_t own_pubkey_len;
3536 unsigned char *own_pubkey_ecpoint;
3537 size_t own_pubkey_ecpoint_len;
3538
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003539 header_len = 4;
Hanno Becker4a63ed42019-01-08 11:39:35 +00003540
Hanno Becker0a94a642019-01-11 14:35:30 +00003541 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Perform PSA-based ECDH computation." ) );
3542
Hanno Becker4a63ed42019-01-08 11:39:35 +00003543 /*
3544 * Generate EC private key for ECDHE exchange.
3545 */
3546
Hanno Becker4a63ed42019-01-08 11:39:35 +00003547 /* The master secret is obtained from the shared ECDH secret by
3548 * applying the TLS 1.2 PRF with a specific salt and label. While
3549 * the PSA Crypto API encourages combining key agreement schemes
3550 * such as ECDH with fixed KDFs such as TLS 1.2 PRF, it does not
3551 * yet support the provisioning of salt + label to the KDF.
3552 * For the time being, we therefore need to split the computation
3553 * of the ECDH secret and the application of the TLS 1.2 PRF. */
Janos Follath53b8ec22019-08-08 10:28:27 +01003554 key_attributes = psa_key_attributes_init();
3555 psa_set_key_usage_flags( &key_attributes, PSA_KEY_USAGE_DERIVE );
Janos Follathdf3b0892019-08-08 11:12:24 +01003556 psa_set_key_algorithm( &key_attributes, PSA_ALG_ECDH );
Gilles Peskine42459802019-12-19 13:31:53 +01003557 psa_set_key_type( &key_attributes, handshake->ecdh_psa_type );
3558 psa_set_key_bits( &key_attributes, handshake->ecdh_bits );
Hanno Becker4a63ed42019-01-08 11:39:35 +00003559
3560 /* Generate ECDH private key. */
Janos Follath53b8ec22019-08-08 10:28:27 +01003561 status = psa_generate_key( &key_attributes,
Janos Follathdf3b0892019-08-08 11:12:24 +01003562 &handshake->ecdh_psa_privkey );
Hanno Becker4a63ed42019-01-08 11:39:35 +00003563 if( status != PSA_SUCCESS )
3564 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3565
3566 /* Export the public part of the ECDH private key from PSA
3567 * and convert it to ECPoint format used in ClientKeyExchange. */
3568 status = psa_export_public_key( handshake->ecdh_psa_privkey,
3569 own_pubkey, sizeof( own_pubkey ),
3570 &own_pubkey_len );
3571 if( status != PSA_SUCCESS )
3572 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3573
3574 if( mbedtls_psa_tls_psa_ec_to_ecpoint( own_pubkey,
3575 own_pubkey_len,
3576 &own_pubkey_ecpoint,
3577 &own_pubkey_ecpoint_len ) != 0 )
3578 {
3579 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3580 }
3581
3582 /* Copy ECPoint structure to outgoing message buffer. */
Andrzej Kurekade9e282019-05-07 08:19:33 -04003583 ssl->out_msg[header_len] = (unsigned char) own_pubkey_ecpoint_len;
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003584 memcpy( ssl->out_msg + header_len + 1,
3585 own_pubkey_ecpoint, own_pubkey_ecpoint_len );
3586 content_len = own_pubkey_ecpoint_len + 1;
Hanno Becker4a63ed42019-01-08 11:39:35 +00003587
Hanno Becker4a63ed42019-01-08 11:39:35 +00003588 /* The ECDH secret is the premaster secret used for key derivation. */
3589
Janos Follathdf3b0892019-08-08 11:12:24 +01003590 /* Compute ECDH shared secret. */
3591 status = psa_raw_key_agreement( PSA_ALG_ECDH,
3592 handshake->ecdh_psa_privkey,
3593 handshake->ecdh_psa_peerkey,
3594 handshake->ecdh_psa_peerkey_len,
3595 ssl->handshake->premaster,
3596 sizeof( ssl->handshake->premaster ),
3597 &ssl->handshake->pmslen );
Hanno Becker4a63ed42019-01-08 11:39:35 +00003598 if( status != PSA_SUCCESS )
3599 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3600
3601 status = psa_destroy_key( handshake->ecdh_psa_privkey );
3602 if( status != PSA_SUCCESS )
3603 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Ronald Croncf56a0a2020-08-04 09:51:30 +02003604 handshake->ecdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Hanno Becker4a63ed42019-01-08 11:39:35 +00003605 }
3606 else
3607#endif /* MBEDTLS_USE_PSA_CRYPTO &&
3608 ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3609 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003610#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3611 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3612 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3613 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
3614 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3615 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3616 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
3617 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01003618 {
3619 /*
3620 * ECDH key exchange -- send client public value
3621 */
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003622 header_len = 4;
Paul Bakker41c83d32013-03-20 14:39:14 +01003623
Gilles Peskineeccd8882020-03-10 12:19:08 +01003624#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003625 if( ssl->handshake->ecrs_enabled )
3626 {
Manuel Pégourié-Gonnardc37423f2018-10-16 10:28:17 +02003627 if( ssl->handshake->ecrs_state == ssl_ecrs_cke_ecdh_calc_secret )
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003628 goto ecdh_calc_secret;
Manuel Pégourié-Gonnard23e41622017-05-18 12:35:37 +02003629
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003630 mbedtls_ecdh_enable_restart( &ssl->handshake->ecdh_ctx );
3631 }
Manuel Pégourié-Gonnard2350b4e2017-05-16 09:26:48 +02003632#endif
3633
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003634 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003635 &content_len,
3636 &ssl->out_msg[header_len], 1000,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003637 ssl->conf->f_rng, ssl->conf->p_rng );
Paul Bakker41c83d32013-03-20 14:39:14 +01003638 if( ret != 0 )
3639 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003640 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
Gilles Peskineeccd8882020-03-10 12:19:08 +01003641#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02003642 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3643 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3644#endif
Paul Bakker41c83d32013-03-20 14:39:14 +01003645 return( ret );
3646 }
3647
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05003648 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3649 MBEDTLS_DEBUG_ECDH_Q );
Paul Bakker41c83d32013-03-20 14:39:14 +01003650
Gilles Peskineeccd8882020-03-10 12:19:08 +01003651#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003652 if( ssl->handshake->ecrs_enabled )
3653 {
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003654 ssl->handshake->ecrs_n = content_len;
Manuel Pégourié-Gonnardc37423f2018-10-16 10:28:17 +02003655 ssl->handshake->ecrs_state = ssl_ecrs_cke_ecdh_calc_secret;
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003656 }
Manuel Pégourié-Gonnard2350b4e2017-05-16 09:26:48 +02003657
3658ecdh_calc_secret:
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003659 if( ssl->handshake->ecrs_enabled )
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003660 content_len = ssl->handshake->ecrs_n;
Manuel Pégourié-Gonnard2350b4e2017-05-16 09:26:48 +02003661#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003662 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003663 &ssl->handshake->pmslen,
3664 ssl->handshake->premaster,
3665 MBEDTLS_MPI_MAX_SIZE,
3666 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003667 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003668 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
Gilles Peskineeccd8882020-03-10 12:19:08 +01003669#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02003670 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3671 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3672#endif
Paul Bakker41c83d32013-03-20 14:39:14 +01003673 return( ret );
3674 }
3675
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05003676 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3677 MBEDTLS_DEBUG_ECDH_Z );
Paul Bakker41c83d32013-03-20 14:39:14 +01003678 }
3679 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003680#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3681 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3682 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3683 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003684#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Hanno Becker1aa267c2017-04-28 17:08:27 +01003685 if( mbedtls_ssl_ciphersuite_uses_psk( ciphersuite_info ) )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003686 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003687 /*
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003688 * opaque psk_identity<0..2^16-1>;
3689 */
Hanno Becker520224e2018-10-26 11:38:07 +01003690 if( ssl_conf_has_static_psk( ssl->conf ) == 0 )
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003691 {
Hanno Becker2e4f6162018-10-23 11:54:44 +01003692 /* We don't offer PSK suites if we don't have a PSK,
3693 * and we check that the server's choice is among the
3694 * ciphersuites we offered, so this should never happen. */
3695 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003696 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003697
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003698 header_len = 4;
3699 content_len = ssl->conf->psk_identity_len;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003700
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003701 if( header_len + 2 + content_len > MBEDTLS_SSL_OUT_CONTENT_LEN )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003702 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003703 MBEDTLS_SSL_DEBUG_MSG( 1,
3704 ( "psk identity too long or SSL buffer too short" ) );
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003705 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3706 }
3707
Joe Subbianifbeb6922021-07-16 14:27:50 +01003708 ssl->out_msg[header_len++] = MBEDTLS_BYTE_1( content_len );
3709 ssl->out_msg[header_len++] = MBEDTLS_BYTE_0( content_len );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003710
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003711 memcpy( ssl->out_msg + header_len,
3712 ssl->conf->psk_identity,
3713 ssl->conf->psk_identity_len );
3714 header_len += ssl->conf->psk_identity_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003715
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003716#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
3717 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003718 {
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003719 content_len = 0;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003720 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003721 else
3722#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003723#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
3724 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003725 {
Hanno Beckerdfab8e22018-10-23 11:59:34 +01003726#if defined(MBEDTLS_USE_PSA_CRYPTO)
3727 /* Opaque PSKs are currently only supported for PSK-only suites. */
Hanno Becker520224e2018-10-26 11:38:07 +01003728 if( ssl_conf_has_static_raw_psk( ssl->conf ) == 0 )
Hanno Beckerdfab8e22018-10-23 11:59:34 +01003729 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3730#endif /* MBEDTLS_USE_PSA_CRYPTO */
3731
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003732 if( ( ret = ssl_write_encrypted_pms( ssl, header_len,
3733 &content_len, 2 ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003734 return( ret );
3735 }
3736 else
3737#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003738#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3739 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003740 {
Hanno Beckerdfab8e22018-10-23 11:59:34 +01003741#if defined(MBEDTLS_USE_PSA_CRYPTO)
3742 /* Opaque PSKs are currently only supported for PSK-only suites. */
Hanno Becker520224e2018-10-26 11:38:07 +01003743 if( ssl_conf_has_static_raw_psk( ssl->conf ) == 0 )
Hanno Beckerdfab8e22018-10-23 11:59:34 +01003744 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3745#endif /* MBEDTLS_USE_PSA_CRYPTO */
3746
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003747 /*
3748 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
3749 */
Gilles Peskine487bbf62021-05-27 22:17:07 +02003750 content_len = mbedtls_dhm_get_len( &ssl->handshake->dhm_ctx );
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003751
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003752 if( header_len + 2 + content_len >
3753 MBEDTLS_SSL_OUT_CONTENT_LEN )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003754 {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003755 MBEDTLS_SSL_DEBUG_MSG( 1,
3756 ( "psk identity or DHM size too long or SSL buffer too short" ) );
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003757 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3758 }
3759
Joe Subbianifbeb6922021-07-16 14:27:50 +01003760 ssl->out_msg[header_len++] = MBEDTLS_BYTE_1( content_len );
3761 ssl->out_msg[header_len++] = MBEDTLS_BYTE_0( content_len );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003762
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003763 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
Gilles Peskine487bbf62021-05-27 22:17:07 +02003764 (int) mbedtls_dhm_get_len( &ssl->handshake->dhm_ctx ),
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003765 &ssl->out_msg[header_len], content_len,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003766 ssl->conf->f_rng, ssl->conf->p_rng );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003767 if( ret != 0 )
3768 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003769 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003770 return( ret );
3771 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003772 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003773 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003774#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
3775#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
3776 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003777 {
Hanno Beckerdfab8e22018-10-23 11:59:34 +01003778#if defined(MBEDTLS_USE_PSA_CRYPTO)
3779 /* Opaque PSKs are currently only supported for PSK-only suites. */
Hanno Becker520224e2018-10-26 11:38:07 +01003780 if( ssl_conf_has_static_raw_psk( ssl->conf ) == 0 )
Hanno Beckerdfab8e22018-10-23 11:59:34 +01003781 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3782#endif /* MBEDTLS_USE_PSA_CRYPTO */
3783
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003784 /*
3785 * ClientECDiffieHellmanPublic public;
3786 */
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003787 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,
3788 &content_len,
3789 &ssl->out_msg[header_len],
3790 MBEDTLS_SSL_OUT_CONTENT_LEN - header_len,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003791 ssl->conf->f_rng, ssl->conf->p_rng );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003792 if( ret != 0 )
3793 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003794 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003795 return( ret );
3796 }
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003797
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05003798 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3799 MBEDTLS_DEBUG_ECDH_Q );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003800 }
3801 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003802#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003803 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003804 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3805 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003806 }
3807
Hanno Beckerafd311e2018-10-23 15:26:40 +01003808#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
3809 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
3810 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK &&
3811 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
Hanno Becker520224e2018-10-26 11:38:07 +01003812 ssl_conf_has_static_raw_psk( ssl->conf ) == 0 )
Hanno Beckerafd311e2018-10-23 15:26:40 +01003813 {
Ronald Cron5ee57072020-06-11 09:34:06 +02003814 MBEDTLS_SSL_DEBUG_MSG( 1,
3815 ( "skip PMS generation for opaque PSK" ) );
Hanno Beckerafd311e2018-10-23 15:26:40 +01003816 }
3817 else
3818#endif /* MBEDTLS_USE_PSA_CRYPTO &&
3819 MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003820 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003821 ciphersuite_info->key_exchange ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003822 {
Ronald Cron5ee57072020-06-11 09:34:06 +02003823 MBEDTLS_SSL_DEBUG_RET( 1,
3824 "mbedtls_ssl_psk_derive_premaster", ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003825 return( ret );
3826 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003827 }
3828 else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003829#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003830#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
3831 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003832 {
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003833 header_len = 4;
3834 if( ( ret = ssl_write_encrypted_pms( ssl, header_len,
3835 &content_len, 0 ) ) != 0 )
Paul Bakkera3d195c2011-11-27 21:07:34 +00003836 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003837 }
Paul Bakkered27a042013-04-18 22:46:23 +02003838 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003839#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003840#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
3841 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
3842 {
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003843 header_len = 4;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003844
3845 ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003846 ssl->out_msg + header_len,
3847 MBEDTLS_SSL_OUT_CONTENT_LEN - header_len,
3848 &content_len,
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003849 ssl->conf->f_rng, ssl->conf->p_rng );
3850 if( ret != 0 )
3851 {
3852 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
3853 return( ret );
3854 }
3855
3856 ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
3857 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
3858 ssl->conf->f_rng, ssl->conf->p_rng );
3859 if( ret != 0 )
3860 {
3861 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
3862 return( ret );
3863 }
3864 }
3865 else
3866#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02003867 {
3868 ((void) ciphersuite_info);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003869 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3870 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakkered27a042013-04-18 22:46:23 +02003871 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003872
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003873 ssl->out_msglen = header_len + content_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003874 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3875 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003876
3877 ssl->state++;
3878
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003879 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003880 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003881 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003882 return( ret );
3883 }
3884
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003885 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003886
3887 return( 0 );
3888}
3889
Gilles Peskineeccd8882020-03-10 12:19:08 +01003890#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003891static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003892{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003893 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003894 ssl->handshake->ciphersuite_info;
Janos Follath865b3eb2019-12-16 11:46:15 +00003895 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003896
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003897 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003898
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003899 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003900 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003901 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003902 return( ret );
3903 }
3904
Hanno Becker77adddc2019-02-07 12:32:43 +00003905 if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Paul Bakkered27a042013-04-18 22:46:23 +02003906 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003907 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakkered27a042013-04-18 22:46:23 +02003908 ssl->state++;
3909 return( 0 );
3910 }
3911
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003912 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3913 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003914}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003915#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003916static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003917{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003918 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003919 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003920 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003921 size_t n = 0, offset = 0;
3922 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003923 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003924 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003925 size_t hashlen;
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003926 void *rs_ctx = NULL;
Gilles Peskinef00f1522021-06-22 00:09:00 +02003927#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3928 size_t out_buf_len = ssl->out_buf_len - ( ssl->out_msg - ssl->out_buf );
3929#else
3930 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN - ( ssl->out_msg - ssl->out_buf );
3931#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003932
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003933 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003934
Gilles Peskineeccd8882020-03-10 12:19:08 +01003935#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003936 if( ssl->handshake->ecrs_enabled &&
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003937 ssl->handshake->ecrs_state == ssl_ecrs_crt_vrfy_sign )
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003938 {
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003939 goto sign;
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003940 }
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003941#endif
3942
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003943 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003944 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003945 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003946 return( ret );
3947 }
3948
Hanno Becker77adddc2019-02-07 12:32:43 +00003949 if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003950 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003951 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003952 ssl->state++;
3953 return( 0 );
3954 }
3955
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003956 if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003957 {
Johan Pascala89ca862020-08-25 10:03:19 +02003958 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
3959 ssl->state++;
3960 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003961 }
3962
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003963 if( mbedtls_ssl_own_key( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003964 {
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003965 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for certificate" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003966 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003967 }
3968
3969 /*
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003970 * Make a signature of the handshake digests
Paul Bakker5121ce52009-01-03 21:22:43 +00003971 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003972#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003973 if( ssl->handshake->ecrs_enabled )
3974 ssl->handshake->ecrs_state = ssl_ecrs_crt_vrfy_sign;
3975
3976sign:
3977#endif
3978
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003979 ssl->handshake->calc_verify( ssl, hash, &hashlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00003980
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003981#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3982 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01003983 {
3984 /*
3985 * digitally-signed struct {
3986 * opaque handshake_messages[handshake_messages_length];
3987 * };
3988 *
3989 * Taking shortcut here. We assume that the server always allows the
3990 * PRF Hash function and has sent it in the allowed signature
3991 * algorithms list received in the Certificate Request message.
3992 *
3993 * Until we encounter a server that does not, we will take this
3994 * shortcut.
3995 *
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003996 * Reason: Otherwise we should have running hashes for SHA512 and
3997 * SHA224 in order to satisfy 'weird' needs from the server
3998 * side.
Paul Bakker926af752012-11-23 13:38:07 +01003999 */
Hanno Beckere694c3e2017-12-27 21:34:08 +00004000 if( ssl->handshake->ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00004001 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004002 md_alg = MBEDTLS_MD_SHA384;
4003 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00004004 }
4005 else
4006 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004007 md_alg = MBEDTLS_MD_SHA256;
4008 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00004009 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004010 ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00004011
Manuel Pégourié-Gonnardbfe32ef2013-08-22 14:55:30 +02004012 /* Info from md_alg will be used instead */
4013 hashlen = 0;
Paul Bakker1ef83d62012-04-11 12:09:53 +00004014 offset = 2;
4015 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02004016 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004017#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02004018 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004019 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
4020 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02004021 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00004022
Gilles Peskineeccd8882020-03-10 12:19:08 +01004023#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02004024 if( ssl->handshake->ecrs_enabled )
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +02004025 rs_ctx = &ssl->handshake->ecrs_ctx.pk;
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02004026#endif
4027
4028 if( ( ret = mbedtls_pk_sign_restartable( mbedtls_ssl_own_key( ssl ),
4029 md_alg, hash_start, hashlen,
Gilles Peskinef00f1522021-06-22 00:09:00 +02004030 ssl->out_msg + 6 + offset,
4031 out_buf_len - 6 - offset,
4032 &n,
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02004033 ssl->conf->f_rng, ssl->conf->p_rng, rs_ctx ) ) != 0 )
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02004034 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004035 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
Gilles Peskineeccd8882020-03-10 12:19:08 +01004036#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02004037 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
4038 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
4039#endif
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02004040 return( ret );
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02004041 }
Paul Bakker926af752012-11-23 13:38:07 +01004042
Joe Subbiani6dd73642021-07-19 11:56:54 +01004043 MBEDTLS_PUT_UINT16_BE( n, ssl->out_msg, offset + 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +00004044
Paul Bakker1ef83d62012-04-11 12:09:53 +00004045 ssl->out_msglen = 6 + n + offset;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004046 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4047 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00004048
4049 ssl->state++;
4050
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02004051 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00004052 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02004053 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004054 return( ret );
4055 }
4056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004057 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004058
Paul Bakkered27a042013-04-18 22:46:23 +02004059 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004060}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004061#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004062
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004063#if defined(MBEDTLS_SSL_SESSION_TICKETS)
4064static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004065{
Janos Follath865b3eb2019-12-16 11:46:15 +00004066 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004067 uint32_t lifetime;
4068 size_t ticket_len;
4069 unsigned char *ticket;
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02004070 const unsigned char *msg;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004071
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004072 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004073
Hanno Becker327c93b2018-08-15 13:56:18 +01004074 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004075 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004076 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004077 return( ret );
4078 }
4079
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004080 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004081 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004082 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01004083 mbedtls_ssl_send_alert_message(
4084 ssl,
4085 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
4086 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004087 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004088 }
4089
4090 /*
4091 * struct {
4092 * uint32 ticket_lifetime_hint;
4093 * opaque ticket<0..2^16-1>;
4094 * } NewSessionTicket;
4095 *
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02004096 * 0 . 3 ticket_lifetime_hint
4097 * 4 . 5 ticket_len (n)
4098 * 6 . 5+n ticket content
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004099 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004100 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET ||
4101 ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004102 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004103 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02004104 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
4105 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Becker241c1972021-06-24 09:44:26 +01004106 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004107 }
4108
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004109 msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004110
Philippe Antoineb5b25432018-05-11 11:06:29 +02004111 lifetime = ( ((uint32_t) msg[0]) << 24 ) | ( msg[1] << 16 ) |
4112 ( msg[2] << 8 ) | ( msg[3] );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004113
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02004114 ticket_len = ( msg[4] << 8 ) | ( msg[5] );
4115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004116 if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004117 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004118 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02004119 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
4120 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Hanno Becker241c1972021-06-24 09:44:26 +01004121 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004122 }
4123
Paul Elliottd48d5c62021-01-07 14:47:05 +00004124 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %" MBEDTLS_PRINTF_SIZET, ticket_len ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004125
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02004126 /* We're not waiting for a NewSessionTicket message any more */
4127 ssl->handshake->new_session_ticket = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004128 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02004129
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004130 /*
4131 * Zero-length ticket means the server changed his mind and doesn't want
4132 * to send a ticket after all, so just forget it
4133 */
Paul Bakker66d5d072014-06-17 16:39:18 +02004134 if( ticket_len == 0 )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004135 return( 0 );
4136
Hanno Beckerb2964cb2019-01-30 14:46:35 +00004137 if( ssl->session != NULL && ssl->session->ticket != NULL )
4138 {
4139 mbedtls_platform_zeroize( ssl->session->ticket,
4140 ssl->session->ticket_len );
4141 mbedtls_free( ssl->session->ticket );
4142 ssl->session->ticket = NULL;
4143 ssl->session->ticket_len = 0;
4144 }
4145
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004146 mbedtls_platform_zeroize( ssl->session_negotiate->ticket,
4147 ssl->session_negotiate->ticket_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004148 mbedtls_free( ssl->session_negotiate->ticket );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004149 ssl->session_negotiate->ticket = NULL;
4150 ssl->session_negotiate->ticket_len = 0;
4151
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02004152 if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004153 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02004154 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02004155 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
4156 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02004157 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004158 }
4159
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02004160 memcpy( ticket, msg + 6, ticket_len );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004161
4162 ssl->session_negotiate->ticket = ticket;
4163 ssl->session_negotiate->ticket_len = ticket_len;
4164 ssl->session_negotiate->ticket_lifetime = lifetime;
4165
4166 /*
4167 * RFC 5077 section 3.4:
4168 * "If the client receives a session ticket from the server, then it
4169 * discards any Session ID that was sent in the ServerHello."
4170 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004171 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02004172 ssl->session_negotiate->id_len = 0;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004173
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004174 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004175
4176 return( 0 );
4177}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004178#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004179
Paul Bakker5121ce52009-01-03 21:22:43 +00004180/*
Paul Bakker1961b702013-01-25 14:49:24 +01004181 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004182 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004183int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00004184{
4185 int ret = 0;
4186
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004187 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
Paul Bakker1961b702013-01-25 14:49:24 +01004188
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004189 /* Change state now, so that it is right in mbedtls_ssl_read_record(), used
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02004190 * by DTLS for dropping out-of-sequence ChangeCipherSpec records */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004191#if defined(MBEDTLS_SSL_SESSION_TICKETS)
4192 if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02004193 ssl->handshake->new_session_ticket != 0 )
4194 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004195 ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02004196 }
4197#endif
4198
Paul Bakker1961b702013-01-25 14:49:24 +01004199 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00004200 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004201 case MBEDTLS_SSL_HELLO_REQUEST:
4202 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004203 break;
4204
Paul Bakker1961b702013-01-25 14:49:24 +01004205 /*
4206 * ==> ClientHello
4207 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004208 case MBEDTLS_SSL_CLIENT_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01004209 ret = ssl_write_client_hello( ssl );
4210 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004211
Paul Bakker1961b702013-01-25 14:49:24 +01004212 /*
4213 * <== ServerHello
4214 * Certificate
4215 * ( ServerKeyExchange )
4216 * ( CertificateRequest )
4217 * ServerHelloDone
4218 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004219 case MBEDTLS_SSL_SERVER_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01004220 ret = ssl_parse_server_hello( ssl );
4221 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004222
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004223 case MBEDTLS_SSL_SERVER_CERTIFICATE:
4224 ret = mbedtls_ssl_parse_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004225 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004226
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004227 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01004228 ret = ssl_parse_server_key_exchange( ssl );
4229 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004230
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004231 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Paul Bakker1961b702013-01-25 14:49:24 +01004232 ret = ssl_parse_certificate_request( ssl );
4233 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004234
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004235 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Paul Bakker1961b702013-01-25 14:49:24 +01004236 ret = ssl_parse_server_hello_done( ssl );
4237 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004238
Paul Bakker1961b702013-01-25 14:49:24 +01004239 /*
4240 * ==> ( Certificate/Alert )
4241 * ClientKeyExchange
4242 * ( CertificateVerify )
4243 * ChangeCipherSpec
4244 * Finished
4245 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004246 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
4247 ret = mbedtls_ssl_write_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004248 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004249
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004250 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01004251 ret = ssl_write_client_key_exchange( ssl );
4252 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004253
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004254 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Paul Bakker1961b702013-01-25 14:49:24 +01004255 ret = ssl_write_certificate_verify( ssl );
4256 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004257
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004258 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
4259 ret = mbedtls_ssl_write_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004260 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004262 case MBEDTLS_SSL_CLIENT_FINISHED:
4263 ret = mbedtls_ssl_write_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004264 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004265
Paul Bakker1961b702013-01-25 14:49:24 +01004266 /*
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004267 * <== ( NewSessionTicket )
4268 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004269 * Finished
4270 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004271#if defined(MBEDTLS_SSL_SESSION_TICKETS)
4272 case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02004273 ret = ssl_parse_new_session_ticket( ssl );
4274 break;
Paul Bakkera503a632013-08-14 13:48:06 +02004275#endif
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02004276
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004277 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4278 ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004279 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004280
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004281 case MBEDTLS_SSL_SERVER_FINISHED:
4282 ret = mbedtls_ssl_parse_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004283 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004284
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004285 case MBEDTLS_SSL_FLUSH_BUFFERS:
4286 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
4287 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004288 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004289
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004290 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
4291 mbedtls_ssl_handshake_wrapup( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004292 break;
Paul Bakker48916f92012-09-16 19:57:18 +00004293
Paul Bakker1961b702013-01-25 14:49:24 +01004294 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004295 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
4296 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker1961b702013-01-25 14:49:24 +01004297 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004298
4299 return( ret );
4300}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004301#endif /* MBEDTLS_SSL_CLI_C */