blob: 8276826dfc880c5b27fe644434bf53f2e9186db3 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 client-side functions
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Bence Szépkúti4e9f7122020-06-05 13:02:18 +02005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 *
7 * This file is provided under the Apache License 2.0, or the
8 * GNU General Public License v2.0 or later.
9 *
10 * **********
11 * Apache License 2.0:
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +020012 *
13 * Licensed under the Apache License, Version 2.0 (the "License"); you may
14 * not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 * http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000024 *
Bence Szépkúti4e9f7122020-06-05 13:02:18 +020025 * **********
26 *
27 * **********
28 * GNU General Public License v2.0 or later:
29 *
30 * This program is free software; you can redistribute it and/or modify
31 * it under the terms of the GNU General Public License as published by
32 * the Free Software Foundation; either version 2 of the License, or
33 * (at your option) any later version.
34 *
35 * This program is distributed in the hope that it will be useful,
36 * but WITHOUT ANY WARRANTY; without even the implied warranty of
37 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38 * GNU General Public License for more details.
39 *
40 * You should have received a copy of the GNU General Public License along
41 * with this program; if not, write to the Free Software Foundation, Inc.,
42 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
43 *
44 * **********
45 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000046 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000047 */
48
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020049#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000050#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020051#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020052#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020053#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000054
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055#if defined(MBEDTLS_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000058#include "mbedtls/platform.h"
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020059#else
Rich Evans00ab4702015-02-06 13:43:58 +000060#include <stdlib.h>
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +020061#define mbedtls_calloc calloc
SimonBd5800b72016-04-26 07:43:27 +010062#define mbedtls_free free
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020063#endif
64
SimonBd5800b72016-04-26 07:43:27 +010065#include "mbedtls/debug.h"
66#include "mbedtls/ssl.h"
67#include "mbedtls/ssl_internal.h"
68
69#include <string.h>
70
Manuel Pégourié-Gonnard93866642015-06-22 19:21:23 +020071#include <stdint.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020072
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020073#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010074#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020075#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000076
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020077#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Paul Bakker34617722014-06-13 17:20:13 +020078/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020079static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020080 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
81}
82#endif
83
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020084#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Hanno Becker0e8dc482017-04-12 14:54:42 +010085static int ssl_write_hostname_ext( mbedtls_ssl_context *ssl,
86 unsigned char *buf,
87 const unsigned char *end,
88 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +010089{
90 unsigned char *p = buf;
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +010091 size_t hostname_len;
Paul Bakkerd3edc862013-03-20 16:07:17 +010092
93 *olen = 0;
94
Paul Bakker66d5d072014-06-17 16:39:18 +020095 if( ssl->hostname == NULL )
Hanno Becker0e8dc482017-04-12 14:54:42 +010096 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +010097
Hanno Becker8cf6b492017-05-08 11:06:19 +010098 MBEDTLS_SSL_DEBUG_MSG( 3,
99 ( "client hello, adding server name extension: %s",
100 ssl->hostname ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100101
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100102 hostname_len = strlen( ssl->hostname );
103
Hanno Becker0e8dc482017-04-12 14:54:42 +0100104 MBEDTLS_SSL_CHK_BUF_PTR( p, end, hostname_len + 9 );
Simon Butchered997662015-09-28 02:14:30 +0100105
Paul Bakkerd3edc862013-03-20 16:07:17 +0100106 /*
Hanno Becker1a9a51c2017-04-07 13:02:16 +0100107 * Sect. 3, RFC 6066 (TLS Extensions Definitions)
108 *
109 * In order to provide any of the server names, clients MAY include an
110 * extension of type "server_name" in the (extended) client hello. The
111 * "extension_data" field of this extension SHALL contain
112 * "ServerNameList" where:
113 *
Paul Bakkerd3edc862013-03-20 16:07:17 +0100114 * struct {
115 * NameType name_type;
116 * select (name_type) {
117 * case host_name: HostName;
118 * } name;
119 * } ServerName;
120 *
121 * enum {
122 * host_name(0), (255)
123 * } NameType;
124 *
125 * opaque HostName<1..2^16-1>;
126 *
127 * struct {
128 * ServerName server_name_list<1..2^16-1>
129 * } ServerNameList;
Hanno Becker1a9a51c2017-04-07 13:02:16 +0100130 *
Paul Bakkerd3edc862013-03-20 16:07:17 +0100131 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200132 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
133 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100134
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100135 *p++ = (unsigned char)( ( (hostname_len + 5) >> 8 ) & 0xFF );
136 *p++ = (unsigned char)( ( (hostname_len + 5) ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100137
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100138 *p++ = (unsigned char)( ( (hostname_len + 3) >> 8 ) & 0xFF );
139 *p++ = (unsigned char)( ( (hostname_len + 3) ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100140
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200141 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100142 *p++ = (unsigned char)( ( hostname_len >> 8 ) & 0xFF );
143 *p++ = (unsigned char)( ( hostname_len ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100144
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100145 memcpy( p, ssl->hostname, hostname_len );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100146
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100147 *olen = hostname_len + 9;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100148
149 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100150}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100152
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200153#if defined(MBEDTLS_SSL_RENEGOTIATION)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100154static int ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,
155 unsigned char *buf,
156 const unsigned char *end,
157 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100158{
159 unsigned char *p = buf;
160
161 *olen = 0;
162
Hanno Becker40f8b512017-10-12 14:58:55 +0100163 /* We're always including an TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the
164 * initial ClientHello, in which case also adding the renegotiation
165 * info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200166 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100167 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100168
Hanno Becker8cf6b492017-05-08 11:06:19 +0100169 MBEDTLS_SSL_DEBUG_MSG( 3,
170 ( "client hello, adding renegotiation extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100171
Hanno Becker0e8dc482017-04-12 14:54:42 +0100172 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 5 + ssl->verify_data_len );
Simon Butchered997662015-09-28 02:14:30 +0100173
Paul Bakkerd3edc862013-03-20 16:07:17 +0100174 /*
175 * Secure renegotiation
176 */
Hanno Becker8cf6b492017-05-08 11:06:19 +0100177 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 )
178 & 0xFF );
179 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO )
180 & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100181
182 *p++ = 0x00;
183 *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
184 *p++ = ssl->verify_data_len & 0xFF;
185
186 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
187
188 *olen = 5 + ssl->verify_data_len;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100189
190 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100191}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200192#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100193
Manuel Pégourié-Gonnardd9423232014-12-02 11:57:29 +0100194/*
195 * Only if we handle at least one key exchange that needs signatures.
196 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200197#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
198 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100199static int ssl_write_signature_algorithms_ext( mbedtls_ssl_context *ssl,
200 unsigned char *buf,
201 const unsigned char *end,
202 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100203{
204 unsigned char *p = buf;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100205 size_t sig_alg_len = 0;
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200206 const int *md;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100207
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200208#if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5bfd9682014-06-24 15:18:11 +0200209 unsigned char *sig_alg_list = buf + 6;
210#endif
Paul Bakkerd3edc862013-03-20 16:07:17 +0100211
212 *olen = 0;
213
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200214 if( ssl->conf->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100215 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100216
Hanno Becker8cf6b492017-05-08 11:06:19 +0100217 MBEDTLS_SSL_DEBUG_MSG( 3,
218 ( "client hello, adding signature_algorithms extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100219
Hanno Becker20643552017-04-12 14:54:42 +0100220 if( ssl->conf->sig_hashes == NULL )
221 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
222
Simon Butchered997662015-09-28 02:14:30 +0100223 for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
224 {
225#if defined(MBEDTLS_ECDSA_C)
226 sig_alg_len += 2;
227#endif
228#if defined(MBEDTLS_RSA_C)
229 sig_alg_len += 2;
230#endif
Hanno Becker20643552017-04-12 14:54:42 +0100231 if( sig_alg_len > MBEDTLS_SSL_MAX_SIG_HASH_ALG_LIST_LEN )
232 {
233 MBEDTLS_SSL_DEBUG_MSG( 3,
234 ( "length in bytes of sig-hash-alg extension too big" ) );
235 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
236 }
Simon Butchered997662015-09-28 02:14:30 +0100237 }
238
Hanno Becker20643552017-04-12 14:54:42 +0100239 /* Empty signature algorithms list, this is a configuration error. */
240 if( sig_alg_len == 0 )
241 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
242
Hanno Becker0e8dc482017-04-12 14:54:42 +0100243 MBEDTLS_SSL_CHK_BUF_PTR( p, end, sig_alg_len + 6 );
Simon Butchered997662015-09-28 02:14:30 +0100244
Paul Bakkerd3edc862013-03-20 16:07:17 +0100245 /*
246 * Prepare signature_algorithms extension (TLS 1.2)
247 */
Simon Butchered997662015-09-28 02:14:30 +0100248 sig_alg_len = 0;
249
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200250 for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
251 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200252#if defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200253 sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
254 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA;
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200255#endif
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200256#if defined(MBEDTLS_RSA_C)
257 sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
258 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA;
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200259#endif
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200260 }
Paul Bakkerd3edc862013-03-20 16:07:17 +0100261
262 /*
263 * enum {
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200264 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
265 * sha512(6), (255)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100266 * } HashAlgorithm;
267 *
268 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
269 * SignatureAlgorithm;
270 *
271 * struct {
272 * HashAlgorithm hash;
273 * SignatureAlgorithm signature;
274 * } SignatureAndHashAlgorithm;
275 *
276 * SignatureAndHashAlgorithm
277 * supported_signature_algorithms<2..2^16-2>;
278 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200279 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
280 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100281
282 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
283 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
284
285 *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
286 *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
287
Paul Bakkerd3edc862013-03-20 16:07:17 +0100288 *olen = 6 + sig_alg_len;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100289
290 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100291}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200292#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
293 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100294
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +0200295#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100296 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100297static int ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,
298 unsigned char *buf,
299 const unsigned char *end,
300 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100301{
302 unsigned char *p = buf;
Manuel Pégourié-Gonnard8e205fc2014-01-23 17:27:10 +0100303 unsigned char *elliptic_curve_list = p + 6;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100304 size_t elliptic_curve_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200305 const mbedtls_ecp_curve_info *info;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200306 const mbedtls_ecp_group_id *grp_id;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100307
308 *olen = 0;
309
Hanno Becker8cf6b492017-05-08 11:06:19 +0100310 MBEDTLS_SSL_DEBUG_MSG( 3,
311 ( "client hello, adding supported_elliptic_curves extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100312
Hanno Becker20643552017-04-12 14:54:42 +0100313 if( ssl->conf->curve_list == NULL )
314 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
315
Hanno Becker8cf6b492017-05-08 11:06:19 +0100316 for( grp_id = ssl->conf->curve_list;
317 *grp_id != MBEDTLS_ECP_DP_NONE;
318 grp_id++ )
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100319 {
Gilles Peskinef9828522017-05-03 12:28:43 +0200320 info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
Janos Follath8a317052016-04-21 23:37:09 +0100321 if( info == NULL )
322 {
Hanno Becker8cf6b492017-05-08 11:06:19 +0100323 MBEDTLS_SSL_DEBUG_MSG( 1,
324 ( "invalid curve in ssl configuration" ) );
Hanno Becker20643552017-04-12 14:54:42 +0100325 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
Janos Follath8a317052016-04-21 23:37:09 +0100326 }
Simon Butchered997662015-09-28 02:14:30 +0100327 elliptic_curve_len += 2;
Hanno Becker20643552017-04-12 14:54:42 +0100328
329 if( elliptic_curve_len > MBEDTLS_SSL_MAX_CURVE_LIST_LEN )
330 {
331 MBEDTLS_SSL_DEBUG_MSG( 3,
332 ( "malformed supported_elliptic_curves extension in config" ) );
333 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
334 }
Simon Butchered997662015-09-28 02:14:30 +0100335 }
336
Hanno Becker20643552017-04-12 14:54:42 +0100337 /* Empty elliptic curve list, this is a configuration error. */
Hanno Becker0e8dc482017-04-12 14:54:42 +0100338 if( elliptic_curve_len == 0 )
Hanno Becker20643552017-04-12 14:54:42 +0100339 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
Hanno Becker0e8dc482017-04-12 14:54:42 +0100340
341 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 + elliptic_curve_len );
Simon Butchered997662015-09-28 02:14:30 +0100342
343 elliptic_curve_len = 0;
344
Hanno Becker8cf6b492017-05-08 11:06:19 +0100345 for( grp_id = ssl->conf->curve_list;
346 *grp_id != MBEDTLS_ECP_DP_NONE;
347 grp_id++ )
Simon Butchered997662015-09-28 02:14:30 +0100348 {
Gilles Peskinef9828522017-05-03 12:28:43 +0200349 info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100350 elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8;
351 elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF;
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200352 }
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200353
Hanno Becker8cf6b492017-05-08 11:06:19 +0100354 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 )
355 & 0xFF );
356 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES )
357 & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100358
359 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
360 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
361
362 *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
363 *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
364
Paul Bakkerd3edc862013-03-20 16:07:17 +0100365 *olen = 6 + elliptic_curve_len;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100366
367 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100368}
369
Hanno Becker0e8dc482017-04-12 14:54:42 +0100370static int ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
371 unsigned char *buf,
372 const unsigned char *end,
373 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100374{
375 unsigned char *p = buf;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100376 (void) ssl; /* ssl used for debugging only */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100377
378 *olen = 0;
379
Hanno Becker8cf6b492017-05-08 11:06:19 +0100380 MBEDTLS_SSL_DEBUG_MSG( 3,
381 ( "client hello, adding supported_point_formats extension" ) );
Hanno Becker0e8dc482017-04-12 14:54:42 +0100382 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
Simon Butchered997662015-09-28 02:14:30 +0100383
Hanno Becker8cf6b492017-05-08 11:06:19 +0100384 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 )
385 & 0xFF );
386 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS )
387 & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100388
389 *p++ = 0x00;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100390 *p++ = 2;
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200391
392 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200393 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100394
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200395 *olen = 6;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100396
397 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100398}
Simon Butcherbb5e1c32018-06-08 11:14:43 +0100399#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
Robert Cragieae8535d2015-10-06 17:11:18 +0100400 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100401
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200402#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100403static int ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
404 unsigned char *buf,
405 const unsigned char *end,
406 size_t *olen )
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200407{
408 int ret;
409 unsigned char *p = buf;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200410 size_t kkpp_len;
411
412 *olen = 0;
413
414 /* Skip costly extension if we can't use EC J-PAKE anyway */
415 if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100416 return( 0 );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200417
Hanno Becker8cf6b492017-05-08 11:06:19 +0100418 MBEDTLS_SSL_DEBUG_MSG( 3,
419 ( "client hello, adding ecjpake_kkpp extension" ) );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200420
Hanno Becker0e8dc482017-04-12 14:54:42 +0100421 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200422
423 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
424 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
425
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200426 /*
427 * We may need to send ClientHello multiple times for Hello verification.
428 * We don't want to compute fresh values every time (both for performance
429 * and consistency reasons), so cache the extension content.
430 */
431 if( ssl->handshake->ecjpake_cache == NULL ||
432 ssl->handshake->ecjpake_cache_len == 0 )
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200433 {
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200434 MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) );
435
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +0200436 ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
Hanno Becker0e8dc482017-04-12 14:54:42 +0100437 p + 2, end - p - 2, &kkpp_len,
438 ssl->conf->f_rng, ssl->conf->p_rng );
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +0200439 if( ret != 0 )
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200440 {
Hanno Becker8cf6b492017-05-08 11:06:19 +0100441 MBEDTLS_SSL_DEBUG_RET( 1 ,
442 "mbedtls_ecjpake_write_round_one", ret );
Hanno Becker0e8dc482017-04-12 14:54:42 +0100443 return( ret );
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200444 }
445
446 ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len );
447 if( ssl->handshake->ecjpake_cache == NULL )
448 {
449 MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) );
Hanno Becker0e8dc482017-04-12 14:54:42 +0100450 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200451 }
452
453 memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len );
454 ssl->handshake->ecjpake_cache_len = kkpp_len;
455 }
456 else
457 {
458 MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) );
459
460 kkpp_len = ssl->handshake->ecjpake_cache_len;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100461 MBEDTLS_SSL_CHK_BUF_PTR( p + 2, end, kkpp_len );
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200462
463 memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200464 }
465
466 *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
467 *p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
468
469 *olen = kkpp_len + 4;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100470
471 return( 0 );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200472}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200473#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000474
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200475#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100476static int ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
477 unsigned char *buf,
478 const unsigned char *end,
479 size_t *olen )
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200480{
481 unsigned char *p = buf;
482
Simon Butcher0fc94e92015-09-28 20:52:04 +0100483 *olen = 0;
484
Hanno Becker0e8dc482017-04-12 14:54:42 +0100485 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE )
486 return( 0 );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200487
Hanno Becker8cf6b492017-05-08 11:06:19 +0100488 MBEDTLS_SSL_DEBUG_MSG( 3,
489 ( "client hello, adding max_fragment_length extension" ) );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200490
Hanno Becker0e8dc482017-04-12 14:54:42 +0100491 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 5 );
Simon Butchered997662015-09-28 02:14:30 +0100492
Hanno Becker8cf6b492017-05-08 11:06:19 +0100493 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 )
494 & 0xFF );
495 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH )
496 & 0xFF );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200497
498 *p++ = 0x00;
499 *p++ = 1;
500
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200501 *p++ = ssl->conf->mfl_code;
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200502
503 *olen = 5;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100504
505 return( 0 );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200506}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200507#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200508
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200509#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100510static int ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
511 unsigned char *buf,
512 const unsigned char *end,
513 size_t *olen )
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200514{
515 unsigned char *p = buf;
516
Simon Butcher0fc94e92015-09-28 20:52:04 +0100517 *olen = 0;
518
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200519 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100520 return( 0 );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200521
Hanno Becker8cf6b492017-05-08 11:06:19 +0100522 MBEDTLS_SSL_DEBUG_MSG( 3,
523 ( "client hello, adding truncated_hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200524
Hanno Becker0e8dc482017-04-12 14:54:42 +0100525 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Simon Butchered997662015-09-28 02:14:30 +0100526
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200527 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
528 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200529
530 *p++ = 0x00;
531 *p++ = 0x00;
532
533 *olen = 4;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100534
535 return( 0 );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200536}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200537#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200538
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200539#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100540static int ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
541 unsigned char *buf,
542 const unsigned char *end,
543 size_t *olen )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100544{
545 unsigned char *p = buf;
546
Simon Butcher0fc94e92015-09-28 20:52:04 +0100547 *olen = 0;
548
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200549 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
550 ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100551 return( 0 );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100552
Hanno Becker8cf6b492017-05-08 11:06:19 +0100553 MBEDTLS_SSL_DEBUG_MSG( 3,
554 ( "client hello, adding encrypt_then_mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100555
Hanno Becker0e8dc482017-04-12 14:54:42 +0100556 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Simon Butchered997662015-09-28 02:14:30 +0100557
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200558 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
559 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100560
561 *p++ = 0x00;
562 *p++ = 0x00;
563
564 *olen = 4;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100565
566 return( 0 );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100567}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200568#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100569
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100571static int ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,
572 unsigned char *buf,
573 const unsigned char *end,
574 size_t *olen )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200575{
576 unsigned char *p = buf;
577
Simon Butcher0fc94e92015-09-28 20:52:04 +0100578 *olen = 0;
579
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200580 if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
581 ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100582 return( 0 );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200583
Hanno Becker8cf6b492017-05-08 11:06:19 +0100584 MBEDTLS_SSL_DEBUG_MSG( 3,
585 ( "client hello, adding extended_master_secret extension" ) );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200586
Hanno Becker0e8dc482017-04-12 14:54:42 +0100587 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Simon Butchered997662015-09-28 02:14:30 +0100588
Hanno Becker8cf6b492017-05-08 11:06:19 +0100589 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 )
590 & 0xFF );
591 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET )
592 & 0xFF );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200593
594 *p++ = 0x00;
595 *p++ = 0x00;
596
597 *olen = 4;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100598
599 return( 0 );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200600}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200601#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200602
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200603#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100604static int ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,
605 unsigned char *buf,
606 const unsigned char *end,
607 size_t *olen )
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200608{
609 unsigned char *p = buf;
610 size_t tlen = ssl->session_negotiate->ticket_len;
611
Simon Butcher0fc94e92015-09-28 20:52:04 +0100612 *olen = 0;
613
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200614 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100615 return( 0 );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200616
Hanno Becker8cf6b492017-05-08 11:06:19 +0100617 MBEDTLS_SSL_DEBUG_MSG( 3,
618 ( "client hello, adding session ticket extension" ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200619
Hanno Becker0e8dc482017-04-12 14:54:42 +0100620 /* The addition is safe here since the ticket length is 16 bit. */
621 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 + tlen );
Simon Butchered997662015-09-28 02:14:30 +0100622
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200623 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
624 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200625
626 *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
627 *p++ = (unsigned char)( ( tlen ) & 0xFF );
628
629 *olen = 4;
630
Simon Butchered997662015-09-28 02:14:30 +0100631 if( ssl->session_negotiate->ticket == NULL || tlen == 0 )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100632 return( 0 );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200633
Hanno Becker8cf6b492017-05-08 11:06:19 +0100634 MBEDTLS_SSL_DEBUG_MSG( 3,
635 ( "sending session ticket of length %d", tlen ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200636
637 memcpy( p, ssl->session_negotiate->ticket, tlen );
638
639 *olen += tlen;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100640
641 return( 0 );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200642}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200643#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200644
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200645#if defined(MBEDTLS_SSL_ALPN)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100646static int ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
647 unsigned char *buf,
648 const unsigned char *end,
649 size_t *olen )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200650{
651 unsigned char *p = buf;
Simon Butchered997662015-09-28 02:14:30 +0100652 size_t alpnlen = 0;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200653 const char **cur;
654
Simon Butcher0fc94e92015-09-28 20:52:04 +0100655 *olen = 0;
656
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200657 if( ssl->conf->alpn_list == NULL )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100658 return( 0 );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200659
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200660 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200661
Simon Butchered997662015-09-28 02:14:30 +0100662 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
Hanno Becker20643552017-04-12 14:54:42 +0100663 alpnlen += strlen( *cur ) + 1;
Simon Butchered997662015-09-28 02:14:30 +0100664
Hanno Becker0e8dc482017-04-12 14:54:42 +0100665 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 + alpnlen );
Simon Butchered997662015-09-28 02:14:30 +0100666
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200667 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );
668 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200669
670 /*
671 * opaque ProtocolName<1..2^8-1>;
672 *
673 * struct {
674 * ProtocolName protocol_name_list<2..2^16-1>
675 * } ProtocolNameList;
676 */
677
678 /* Skip writing extension and list length for now */
679 p += 4;
680
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200681 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200682 {
Hanno Becker20643552017-04-12 14:54:42 +0100683 /*
684 * mbedtls_ssl_conf_set_alpn_protocols() checked that the length of
685 * protocol names is less than 255.
686 */
687 *p = (unsigned char)strlen( *cur );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200688 memcpy( p + 1, *cur, *p );
689 p += 1 + *p;
690 }
691
692 *olen = p - buf;
693
694 /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
695 buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
696 buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF );
697
698 /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */
699 buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
700 buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF );
Hanno Becker0e8dc482017-04-12 14:54:42 +0100701
702 return( 0 );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200703}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200704#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200705
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200706/*
707 * Generate random bytes for ClientHello
708 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200709static int ssl_generate_random( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200710{
711 int ret;
712 unsigned char *p = ssl->handshake->randbytes;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200713#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +0100714 mbedtls_time_t t;
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200715#endif
716
Manuel Pégourié-Gonnardfb2d2232014-07-22 15:59:14 +0200717 /*
718 * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1)
719 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200720#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200721 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnardfb2d2232014-07-22 15:59:14 +0200722 ssl->handshake->verify_cookie != NULL )
723 {
724 return( 0 );
725 }
726#endif
727
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200728#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +0100729 t = mbedtls_time( NULL );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200730 *p++ = (unsigned char)( t >> 24 );
731 *p++ = (unsigned char)( t >> 16 );
732 *p++ = (unsigned char)( t >> 8 );
733 *p++ = (unsigned char)( t );
734
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200735 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200736#else
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +0100737 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200738 return( ret );
739
740 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200741#endif /* MBEDTLS_HAVE_TIME */
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200742
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +0100743 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200744 return( ret );
745
746 return( 0 );
747}
748
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +0100749/**
750 * \brief Validate cipher suite against config in SSL context.
751 *
752 * \param suite_info cipher suite to validate
753 * \param ssl SSL context
Andrzej Kurek66080962018-04-25 05:06:07 -0400754 * \param min_minor_ver Minimal minor version to accept a cipher suite
755 * \param max_minor_ver Maximal minor version to accept a cipher suite
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +0100756 *
757 * \return 0 if valid, else 1
758 */
Hanno Becker8cf6b492017-05-08 11:06:19 +0100759static int ssl_validate_ciphersuite(
760 const mbedtls_ssl_ciphersuite_t * suite_info,
761 const mbedtls_ssl_context * ssl,
762 int min_minor_ver, int max_minor_ver )
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +0100763{
Andrzej Kurek66080962018-04-25 05:06:07 -0400764 (void) ssl;
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +0100765 if( suite_info == NULL )
766 return( 1 );
767
Andrzej Kurek66080962018-04-25 05:06:07 -0400768 if( suite_info->min_minor_ver > max_minor_ver ||
769 suite_info->max_minor_ver < min_minor_ver )
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +0100770 return( 1 );
771
772#if defined(MBEDTLS_SSL_PROTO_DTLS)
773 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
774 ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )
775 return( 1 );
776#endif
777
778#if defined(MBEDTLS_ARC4_C)
779 if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&
780 suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
781 return( 1 );
782#endif
783
784#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
785 if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
786 mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
787 return( 1 );
788#endif
789
790 return( 0 );
791}
792
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200793static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +0000794{
Paul Bakker23986e52011-04-24 08:57:21 +0000795 int ret;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100796 size_t i, n, olen, ext_len = 0;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100797
Paul Bakker5121ce52009-01-03 21:22:43 +0000798 unsigned char *buf;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200799 unsigned char *p, *q;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100800 const unsigned char *end;
801
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +0200802 unsigned char offer_compress;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200803 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200804 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Ron Eldorc32b3b72018-02-14 19:30:48 +0200805#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
806 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
807 int uses_ec = 0;
808#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000809
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200810 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000811
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +0100812 if( ssl->conf->f_rng == NULL )
Paul Bakkera9a028e2013-11-21 17:31:06 +0100813 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200814 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
815 return( MBEDTLS_ERR_SSL_NO_RNG );
Paul Bakkera9a028e2013-11-21 17:31:06 +0100816 }
817
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200818#if defined(MBEDTLS_SSL_RENEGOTIATION)
819 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100820#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000821 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200822 ssl->major_ver = ssl->conf->min_major_ver;
823 ssl->minor_ver = ssl->conf->min_minor_ver;
Paul Bakker48916f92012-09-16 19:57:18 +0000824 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000825
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +0200826 if( ssl->conf->max_major_ver == 0 )
Paul Bakker490ecc82011-10-06 13:04:09 +0000827 {
Hanno Becker8cf6b492017-05-08 11:06:19 +0100828 MBEDTLS_SSL_DEBUG_MSG( 1,
829 ( "configured max major version is invalid, consider using mbedtls_ssl_config_defaults()" ) );
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +0200830 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker490ecc82011-10-06 13:04:09 +0000831 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000832
Hanno Becker0e8dc482017-04-12 14:54:42 +0100833 buf = ssl->out_msg;
834 end = buf + MBEDTLS_SSL_MAX_CONTENT_LEN;
835
Paul Bakker5121ce52009-01-03 21:22:43 +0000836 /*
Hanno Becker0e8dc482017-04-12 14:54:42 +0100837 * Check if there's enough space for the first part of the ClientHello
838 * consisting of the 38 bytes described below, the session identifier (at
839 * most 32 bytes) and its length (1 byte).
840 *
841 * Use static upper bounds instead of the actual values
842 * to allow the compiler to optimize this away.
843 */
844 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 38 + 1 + 32 );
845
846 /*
847 * The 38 first bytes of the ClientHello:
848 * 0 . 0 handshake type (written later)
849 * 1 . 3 handshake length (written later)
Paul Bakker5121ce52009-01-03 21:22:43 +0000850 * 4 . 5 highest version supported
851 * 6 . 9 current UNIX time
852 * 10 . 37 random bytes
Hanno Becker0e8dc482017-04-12 14:54:42 +0100853 *
854 * The current UNIX time (4 bytes) and following 28 random bytes are written
855 * by ssl_generate_random() into ssl->handshake->randbytes buffer and then
856 * copied from there into the output buffer.
Paul Bakker5121ce52009-01-03 21:22:43 +0000857 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000858
Hanno Becker0e8dc482017-04-12 14:54:42 +0100859 p = buf + 4;
Hanno Becker8cf6b492017-05-08 11:06:19 +0100860 mbedtls_ssl_write_version( ssl->conf->max_major_ver,
861 ssl->conf->max_minor_ver,
862 ssl->conf->transport, p );
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100863 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000864
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200865 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
Paul Bakker5121ce52009-01-03 21:22:43 +0000866 buf[4], buf[5] ) );
867
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200868 if( ( ret = ssl_generate_random( ssl ) ) != 0 )
869 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200870 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200871 return( ret );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200872 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200873
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200874 memcpy( p, ssl->handshake->randbytes, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200875 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", p, 32 );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200876 p += 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000877
878 /*
879 * 38 . 38 session id length
880 * 39 . 39+n session id
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100881 * 39+n . 39+n DTLS only: cookie length (1 byte)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100882 * 40+n . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100883 * .. . .. ciphersuitelist length (2 bytes)
884 * .. . .. ciphersuitelist
885 * .. . .. compression methods length (1 byte)
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000886 * .. . .. compression methods
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100887 * .. . .. extensions length (2 bytes)
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000888 * .. . .. extensions
Paul Bakker5121ce52009-01-03 21:22:43 +0000889 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200890 n = ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +0000891
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100892 if( n < 16 || n > 32 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200893#if defined(MBEDTLS_SSL_RENEGOTIATION)
894 ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100895#endif
Paul Bakker0a597072012-09-25 21:55:46 +0000896 ssl->handshake->resume == 0 )
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200897 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000898 n = 0;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200899 }
900
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200901#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200902 /*
903 * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
904 * generate and include a Session ID in the TLS ClientHello."
905 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200906#if defined(MBEDTLS_SSL_RENEGOTIATION)
907 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000908#endif
Manuel Pégourié-Gonnardd2b35ec2015-03-10 11:40:43 +0000909 {
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000910 if( ssl->session_negotiate->ticket != NULL &&
911 ssl->session_negotiate->ticket_len != 0 )
912 {
Hanno Becker8cf6b492017-05-08 11:06:19 +0100913 ret = ssl->conf->f_rng( ssl->conf->p_rng,
914 ssl->session_negotiate->id, 32 );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200915
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000916 if( ret != 0 )
917 return( ret );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200918
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200919 ssl->session_negotiate->id_len = n = 32;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000920 }
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200921 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200922#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Paul Bakker5121ce52009-01-03 21:22:43 +0000923
Hanno Becker0e8dc482017-04-12 14:54:42 +0100924 /*
925 * The first check of the output buffer size above (
926 * MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 38 + 1 + 32 );)
927 * has checked that there is enough space in the output buffer for the
928 * session identifier length byte and the session identifier (n <= 32).
929 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000930 *p++ = (unsigned char) n;
931
932 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +0000933 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000934
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200935 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
936 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000937
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100938 /*
Hanno Becker0e8dc482017-04-12 14:54:42 +0100939 * With 'n' being the length of the session identifier
940 *
941 * 39+n . 39+n DTLS only: cookie length (1 byte)
942 * 40+n . .. DTLS only: cookie
943 * .. . .. ciphersuitelist length (2 bytes)
944 * .. . .. ciphersuitelist
945 * .. . .. compression methods length (1 byte)
946 * .. . .. compression methods
947 * .. . .. extensions length (2 bytes)
948 * .. . .. extensions
949 */
950
951 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100952 * DTLS cookie
953 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200954#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200955 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100956 {
Hanno Becker0e8dc482017-04-12 14:54:42 +0100957 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 1 );
958
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200959 if( ssl->handshake->verify_cookie == NULL )
960 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200961 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no verify cookie to send" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200962 *p++ = 0;
963 }
964 else
965 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200966 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200967 ssl->handshake->verify_cookie,
968 ssl->handshake->verify_cookie_len );
969
970 *p++ = ssl->handshake->verify_cookie_len;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100971
972 MBEDTLS_SSL_CHK_BUF_PTR( p, end,
973 ssl->handshake->verify_cookie_len );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200974 memcpy( p, ssl->handshake->verify_cookie,
975 ssl->handshake->verify_cookie_len );
976 p += ssl->handshake->verify_cookie_len;
977 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100978 }
979#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000980
Paul Bakker48916f92012-09-16 19:57:18 +0000981 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100982 * Ciphersuite list
Paul Bakker48916f92012-09-16 19:57:18 +0000983 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200984 ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100985
986 /* Skip writing ciphersuite length for now */
987 n = 0;
988 q = p;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100989
990 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100991 p += 2;
992
Paul Bakker2fbefde2013-06-29 16:01:15 +0200993 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000994 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200995 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuites[i] );
Paul Bakker2fbefde2013-06-29 16:01:15 +0200996
Andrzej Kurek66080962018-04-25 05:06:07 -0400997 if( ssl_validate_ciphersuite( ciphersuite_info, ssl,
998 ssl->conf->min_minor_ver,
999 ssl->conf->max_minor_ver ) != 0 )
Paul Bakker2fbefde2013-06-29 16:01:15 +02001000 continue;
1001
Manuel Pégourié-Gonnard60884a12015-09-16 11:13:41 +02001002 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x",
1003 ciphersuites[i] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001004
Ron Eldorc32b3b72018-02-14 19:30:48 +02001005#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
1006 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1007 uses_ec |= mbedtls_ssl_ciphersuite_uses_ec( ciphersuite_info );
1008#endif
1009
Hanno Becker0e8dc482017-04-12 14:54:42 +01001010 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
1011
Paul Bakker2fbefde2013-06-29 16:01:15 +02001012 n++;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001013 *p++ = (unsigned char)( ciphersuites[i] >> 8 );
1014 *p++ = (unsigned char)( ciphersuites[i] );
Paul Bakker5121ce52009-01-03 21:22:43 +00001015 }
1016
Hanno Becker8cf6b492017-05-08 11:06:19 +01001017 MBEDTLS_SSL_DEBUG_MSG( 3,
1018 ( "client hello, got %d ciphersuites (excluding SCSVs)", n ) );
Ron Eldor714785d2017-08-28 13:55:55 +03001019
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001020 /*
1021 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1022 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001023#if defined(MBEDTLS_SSL_RENEGOTIATION)
1024 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001025#endif
1026 {
Ron Eldor4a2fb4c2017-09-10 17:03:50 +03001027 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding EMPTY_RENEGOTIATION_INFO_SCSV" ) );
Hanno Becker0e8dc482017-04-12 14:54:42 +01001028 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001029 *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
1030 *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO );
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001031 n++;
1032 }
1033
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001034 /* Some versions of OpenSSL don't handle it correctly if not at end */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001035#if defined(MBEDTLS_SSL_FALLBACK_SCSV)
Manuel Pégourié-Gonnard684b0592015-05-06 09:27:31 +01001036 if( ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK )
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001037 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001038 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding FALLBACK_SCSV" ) );
Hanno Becker0e8dc482017-04-12 14:54:42 +01001039
1040 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041 *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 );
1042 *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE );
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001043 n++;
1044 }
1045#endif
1046
Paul Bakker2fbefde2013-06-29 16:01:15 +02001047 *q++ = (unsigned char)( n >> 7 );
1048 *q++ = (unsigned char)( n << 1 );
1049
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001050#if defined(MBEDTLS_ZLIB_SUPPORT)
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001051 offer_compress = 1;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001052#else
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001053 offer_compress = 0;
1054#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001055
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001056 /*
Johannes H4e5d23f2018-01-06 09:46:57 +01001057 * We don't support compression with DTLS right now: if many records come
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001058 * in the same datagram, uncompressing one could overwrite the next one.
1059 * We don't want to add complexity for handling that case unless there is
1060 * an actual need for it.
1061 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001062#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001063 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001064 offer_compress = 0;
1065#endif
1066
1067 if( offer_compress )
1068 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001069 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
1070 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
Hanno Becker8cf6b492017-05-08 11:06:19 +01001071 MBEDTLS_SSL_COMPRESS_DEFLATE,
1072 MBEDTLS_SSL_COMPRESS_NULL ) );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001073
Hanno Becker0e8dc482017-04-12 14:54:42 +01001074 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 3 );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001075 *p++ = 2;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001076 *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE;
1077 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001078 }
1079 else
1080 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001081 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
1082 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d",
1083 MBEDTLS_SSL_COMPRESS_NULL ) );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001084
Hanno Becker0e8dc482017-04-12 14:54:42 +01001085 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001086 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001087 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001088 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001089
Hanno Becker0e8dc482017-04-12 14:54:42 +01001090 /* First write extensions, then the total length */
1091
1092 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
1093
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001094#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001095 if( ( ret = ssl_write_hostname_ext( ssl, p + 2 + ext_len,
1096 end, &olen ) ) != 0 )
1097 {
1098 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_hostname_ext", ret );
1099 return( ret );
1100 }
Paul Bakkerd3edc862013-03-20 16:07:17 +01001101 ext_len += olen;
Paul Bakker0be444a2013-08-27 21:55:01 +02001102#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001103
Hanno Becker40f8b512017-10-12 14:58:55 +01001104 /* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added
1105 * even if MBEDTLS_SSL_RENEGOTIATION is not defined. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001106#if defined(MBEDTLS_SSL_RENEGOTIATION)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001107 if( ( ret = ssl_write_renegotiation_ext( ssl, p + 2 + ext_len,
1108 end, &olen ) ) != 0 )
1109 {
1110 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_renegotiation_ext", ret );
1111 return( ret );
1112 }
Paul Bakkerd3edc862013-03-20 16:07:17 +01001113 ext_len += olen;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001114#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001116#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1117 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001118 if( ( ret = ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len,
1119 end, &olen ) ) != 0 )
1120 {
1121 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_signature_algorithms_ext", ret );
1122 return( ret );
1123 }
Paul Bakkerd3edc862013-03-20 16:07:17 +01001124 ext_len += olen;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001125#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001126
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +02001127#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01001128 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Ron Eldorc32b3b72018-02-14 19:30:48 +02001129 if( uses_ec )
1130 {
Hanno Becker0e8dc482017-04-12 14:54:42 +01001131 if( ( ret = ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len,
1132 end, &olen ) ) != 0 )
1133 {
1134 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_supported_elliptic_curves_ext", ret );
1135 return( ret );
1136 }
Ron Eldorc32b3b72018-02-14 19:30:48 +02001137 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +01001138
Hanno Becker0e8dc482017-04-12 14:54:42 +01001139 if( ( ret = ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len,
1140 end, &olen ) ) != 0 )
1141 {
1142 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_supported_point_formats_ext", ret );
1143 return( ret );
1144 }
Ron Eldorc32b3b72018-02-14 19:30:48 +02001145 ext_len += olen;
1146 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001147#endif
1148
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02001149#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001150 if( ( ret = ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len,
1151 end, &olen ) ) != 0 )
1152 {
1153 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_ecjpake_kkpp_ext", ret );
1154 return( ret );
1155 }
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +02001156 ext_len += olen;
1157#endif
1158
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001159#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001160 if( ( ret = ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len,
1161 end, &olen ) ) != 0 )
1162 {
1163 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_max_fragment_length_ext", ret );
1164 return( ret );
1165 }
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001166 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02001167#endif
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001168
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001169#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001170 if( ( ret = ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len,
1171 end, &olen ) ) != 0 )
1172 {
1173 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_truncated_hmac_ext", ret );
1174 return( ret );
1175 }
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001176 ext_len += olen;
Paul Bakker1f2bc622013-08-15 13:45:55 +02001177#endif
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001178
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001179#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001180 if( ( ret = ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len,
1181 end, &olen ) ) != 0 )
1182 {
1183 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_encrypt_then_mac_ext", ret );
1184 return( ret );
1185 }
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001186 ext_len += olen;
1187#endif
1188
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001189#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001190 if( ( ret = ssl_write_extended_ms_ext( ssl, p + 2 + ext_len,
1191 end, &olen ) ) != 0 )
1192 {
1193 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_extended_ms_ext", ret );
1194 return( ret );
1195 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001196 ext_len += olen;
1197#endif
1198
Simon Butcher5624ec82015-09-29 01:06:06 +01001199#if defined(MBEDTLS_SSL_ALPN)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001200 if( ( ret = ssl_write_alpn_ext( ssl, p + 2 + ext_len,
1201 end, &olen ) ) != 0 )
1202 {
1203 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_alpn_ext", ret );
1204 return( ret );
1205 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001206 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02001207#endif
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001208
Simon Butcher5624ec82015-09-29 01:06:06 +01001209#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001210 if( ( ret = ssl_write_session_ticket_ext( ssl, p + 2 + ext_len,
1211 end, &olen ) ) != 0 )
1212 {
1213 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_session_ticket_ext", ret );
1214 return( ret );
1215 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001216 ext_len += olen;
1217#endif
1218
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001219 /* olen unused if all extensions are disabled */
1220 ((void) olen);
1221
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001222 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
Hanno Becker0e8dc482017-04-12 14:54:42 +01001223 ext_len ) );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001224
Paul Bakkera7036632014-04-30 10:15:38 +02001225 if( ext_len > 0 )
1226 {
Hanno Becker0e8dc482017-04-12 14:54:42 +01001227 /* No need to check for space here, because the extension
1228 * writing functions already took care of that. */
Paul Bakkera7036632014-04-30 10:15:38 +02001229 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
1230 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
1231 p += ext_len;
1232 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001233
Paul Bakker5121ce52009-01-03 21:22:43 +00001234 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001235 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
1236 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00001237
1238 ssl->state++;
1239
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001240#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001241 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001242 mbedtls_ssl_send_flight_completed( ssl );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02001243#endif
1244
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001245 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001246 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001247 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001248 return( ret );
1249 }
1250
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001251 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001252
1253 return( 0 );
1254}
1255
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001256static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001257 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +00001258 size_t len )
1259{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001260#if defined(MBEDTLS_SSL_RENEGOTIATION)
1261 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00001262 {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001263 /* Check verify-data in constant-time. The length OTOH is no secret */
Paul Bakker48916f92012-09-16 19:57:18 +00001264 if( len != 1 + ssl->verify_data_len * 2 ||
1265 buf[0] != ssl->verify_data_len * 2 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001266 mbedtls_ssl_safer_memcmp( buf + 1,
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001267 ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001268 mbedtls_ssl_safer_memcmp( buf + 1 + ssl->verify_data_len,
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001269 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001270 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001271 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001272 mbedtls_ssl_send_alert_message(
1273 ssl,
1274 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1275 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001276 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001277 }
1278 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001279 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001280#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001281 {
1282 if( len != 1 || buf[0] != 0x00 )
1283 {
Ronald Cron904775d2020-06-11 09:34:06 +02001284 MBEDTLS_SSL_DEBUG_MSG( 1,
1285 ( "non-zero length renegotiation info" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001286 mbedtls_ssl_send_alert_message(
1287 ssl,
1288 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1289 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001290 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001291 }
1292
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001293 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001294 }
Paul Bakker48916f92012-09-16 19:57:18 +00001295
1296 return( 0 );
1297}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001298
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001299#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1300static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001301 const unsigned char *buf,
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001302 size_t len )
1303{
1304 /*
1305 * server should use the extension only if we did,
1306 * and if so the server's value should match ours (and len is always 1)
1307 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001308 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ||
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001309 len != 1 ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001310 buf[0] != ssl->conf->mfl_code )
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001311 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001312 MBEDTLS_SSL_DEBUG_MSG( 1,
1313 ( "non-matching max fragment length extension" ) );
1314 mbedtls_ssl_send_alert_message(
1315 ssl,
1316 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1317 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001318 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001319 }
1320
1321 return( 0 );
1322}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001323#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Paul Bakker48916f92012-09-16 19:57:18 +00001324
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001325#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1326static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001327 const unsigned char *buf,
1328 size_t len )
1329{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001330 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ||
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001331 len != 0 )
1332 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001333 MBEDTLS_SSL_DEBUG_MSG( 1,
1334 ( "non-matching truncated HMAC extension" ) );
1335 mbedtls_ssl_send_alert_message(
1336 ssl,
1337 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1338 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001339 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001340 }
1341
1342 ((void) buf);
1343
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001344 ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001345
1346 return( 0 );
1347}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001348#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001350#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1351static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001352 const unsigned char *buf,
1353 size_t len )
1354{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001355 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001356 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001357 len != 0 )
1358 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001359 MBEDTLS_SSL_DEBUG_MSG( 1,
1360 ( "non-matching encrypt-then-MAC extension" ) );
1361 mbedtls_ssl_send_alert_message(
1362 ssl,
1363 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1364 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001365 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001366 }
1367
1368 ((void) buf);
1369
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001370 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001371
1372 return( 0 );
1373}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001374#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001375
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001376#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1377static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001378 const unsigned char *buf,
1379 size_t len )
1380{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001381 if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001382 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001383 len != 0 )
1384 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001385 MBEDTLS_SSL_DEBUG_MSG( 1,
1386 ( "non-matching extended master secret extension" ) );
1387 mbedtls_ssl_send_alert_message(
1388 ssl,
1389 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1390 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001391 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001392 }
1393
1394 ((void) buf);
1395
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001396 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001397
1398 return( 0 );
1399}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001400#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001401
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001402#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1403static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001404 const unsigned char *buf,
1405 size_t len )
1406{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001407 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ||
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02001408 len != 0 )
1409 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001410 MBEDTLS_SSL_DEBUG_MSG( 1,
1411 ( "non-matching session ticket extension" ) );
1412 mbedtls_ssl_send_alert_message(
1413 ssl,
1414 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1415 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001416 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02001417 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001418
1419 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02001420
1421 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001422
1423 return( 0 );
1424}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001425#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001426
Robert Cragie136884c2015-10-02 13:34:31 +01001427#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01001428 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001429static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001430 const unsigned char *buf,
1431 size_t len )
1432{
1433 size_t list_size;
1434 const unsigned char *p;
1435
Philippe Antoine33e5c322018-07-09 10:39:02 +02001436 if( len == 0 || (size_t)( buf[0] + 1 ) != len )
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001437 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001438 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001439 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1440 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001441 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001442 }
Philippe Antoine33e5c322018-07-09 10:39:02 +02001443 list_size = buf[0];
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001444
Manuel Pégourié-Gonnardfd35af12014-06-23 14:10:13 +02001445 p = buf + 1;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001446 while( list_size > 0 )
1447 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001448 if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
1449 p[0] == MBEDTLS_ECP_PF_COMPRESSED )
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001450 {
Robert Cragie136884c2015-10-02 13:34:31 +01001451#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +02001452 ssl->handshake->ecdh_ctx.point_format = p[0];
Gilles Peskine064a85c2017-05-10 10:46:40 +02001453#endif
Robert Cragieae8535d2015-10-06 17:11:18 +01001454#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Robert Cragie136884c2015-10-02 13:34:31 +01001455 ssl->handshake->ecjpake_ctx.point_format = p[0];
1456#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001457 MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001458 return( 0 );
1459 }
1460
1461 list_size--;
1462 p++;
1463 }
1464
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001465 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001466 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1467 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001468 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001469}
Simon Butcherbb5e1c32018-06-08 11:14:43 +01001470#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
Robert Cragieae8535d2015-10-06 17:11:18 +01001471 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001472
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001473#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1474static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
1475 const unsigned char *buf,
1476 size_t len )
1477{
1478 int ret;
1479
1480 if( ssl->transform_negotiate->ciphersuite_info->key_exchange !=
1481 MBEDTLS_KEY_EXCHANGE_ECJPAKE )
1482 {
1483 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
1484 return( 0 );
1485 }
1486
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +02001487 /* If we got here, we no longer need our cached extension */
1488 mbedtls_free( ssl->handshake->ecjpake_cache );
1489 ssl->handshake->ecjpake_cache = NULL;
1490 ssl->handshake->ecjpake_cache_len = 0;
1491
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001492 if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
1493 buf, len ) ) != 0 )
1494 {
1495 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001496 mbedtls_ssl_send_alert_message(
1497 ssl,
1498 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1499 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001500 return( ret );
1501 }
1502
1503 return( 0 );
1504}
1505#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001506
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001507#if defined(MBEDTLS_SSL_ALPN)
1508static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001509 const unsigned char *buf, size_t len )
1510{
1511 size_t list_len, name_len;
1512 const char **p;
1513
1514 /* If we didn't send it, the server shouldn't send it */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001515 if( ssl->conf->alpn_list == NULL )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001516 {
1517 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching ALPN extension" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001518 mbedtls_ssl_send_alert_message(
1519 ssl,
1520 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1521 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001522 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001523 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001524
1525 /*
1526 * opaque ProtocolName<1..2^8-1>;
1527 *
1528 * struct {
1529 * ProtocolName protocol_name_list<2..2^16-1>
1530 * } ProtocolNameList;
1531 *
1532 * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
1533 */
1534
1535 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
1536 if( len < 4 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001537 {
1538 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1539 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001540 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001541 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001542
1543 list_len = ( buf[0] << 8 ) | buf[1];
1544 if( list_len != len - 2 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001545 {
1546 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1547 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001548 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001549 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001550
1551 name_len = buf[2];
1552 if( name_len != list_len - 1 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001553 {
1554 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1555 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001556 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001557 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001558
1559 /* Check that the server chosen protocol was in our list and save it */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001560 for( p = ssl->conf->alpn_list; *p != NULL; p++ )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001561 {
1562 if( name_len == strlen( *p ) &&
1563 memcmp( buf + 3, *p, name_len ) == 0 )
1564 {
1565 ssl->alpn_chosen = *p;
1566 return( 0 );
1567 }
1568 }
1569
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001570 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ALPN extension: no matching protocol" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001571 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1572 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001573 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001574}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001575#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001576
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001577/*
1578 * Parse HelloVerifyRequest. Only called after verifying the HS type.
1579 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001580#if defined(MBEDTLS_SSL_PROTO_DTLS)
1581static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001582{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001583 const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001584 int major_ver, minor_ver;
1585 unsigned char cookie_len;
1586
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001587 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001588
Gilles Peskine2414ce12019-09-27 14:02:44 +02001589 /* Check that there is enough room for:
1590 * - 2 bytes of version
1591 * - 1 byte of cookie_len
1592 */
1593 if( mbedtls_ssl_hs_hdr_len( ssl ) + 3 > ssl->in_msglen )
1594 {
1595 MBEDTLS_SSL_DEBUG_MSG( 1,
1596 ( "incoming HelloVerifyRequest message is too short" ) );
1597 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1598 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1599 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1600 }
1601
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001602 /*
1603 * struct {
1604 * ProtocolVersion server_version;
1605 * opaque cookie<0..2^8-1>;
1606 * } HelloVerifyRequest;
1607 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001608 MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001609 mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001610 p += 2;
1611
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02001612 /*
1613 * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1)
1614 * even is lower than our min version.
1615 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001616 if( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
1617 minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001618 major_ver > ssl->conf->max_major_ver ||
1619 minor_ver > ssl->conf->max_minor_ver )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001620 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001621 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server version" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001622
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001623 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1624 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001625
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001626 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001627 }
1628
1629 cookie_len = *p++;
Andres AG5a87c932016-09-26 14:53:05 +01001630 if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len )
1631 {
1632 MBEDTLS_SSL_DEBUG_MSG( 1,
1633 ( "cookie length does not match incoming message size" ) );
1634 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1635 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1636 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1637 }
Gilles Peskine99b67772019-09-27 14:00:36 +02001638 MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len );
Andres AG5a87c932016-09-26 14:53:05 +01001639
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001640 mbedtls_free( ssl->handshake->verify_cookie );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001641
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001642 ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001643 if( ssl->handshake->verify_cookie == NULL )
1644 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02001645 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", cookie_len ) );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02001646 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001647 }
1648
1649 memcpy( ssl->handshake->verify_cookie, p, cookie_len );
1650 ssl->handshake->verify_cookie_len = cookie_len;
1651
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02001652 /* Start over at ClientHello */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001653 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
1654 mbedtls_ssl_reset_checksum( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001655
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001656 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001657
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001658 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse hello verify request" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001659
1660 return( 0 );
1661}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001662#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001663
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001664static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001665{
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001666 int ret, i;
Paul Bakker23986e52011-04-24 08:57:21 +00001667 size_t n;
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001668 size_t ext_len;
Paul Bakker48916f92012-09-16 19:57:18 +00001669 unsigned char *buf, *ext;
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001670 unsigned char comp;
1671#if defined(MBEDTLS_ZLIB_SUPPORT)
1672 int accept_comp;
1673#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001674#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001675 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001676#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001677 int handshake_failure = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001678 const mbedtls_ssl_ciphersuite_t *suite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001679
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001680 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001681
Paul Bakker5121ce52009-01-03 21:22:43 +00001682 buf = ssl->in_msg;
1683
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001684 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001685 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001686 /* No alert on a read error. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001687 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001688 return( ret );
1689 }
1690
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001691 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001692 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001693#if defined(MBEDTLS_SSL_RENEGOTIATION)
1694 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001695 {
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001696 ssl->renego_records_seen++;
1697
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001698 if( ssl->conf->renego_max_records >= 0 &&
1699 ssl->renego_records_seen > ssl->conf->renego_max_records )
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001700 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001701 MBEDTLS_SSL_DEBUG_MSG( 1,
1702 ( "renegotiation requested, but not honored by server" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001703 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001704 }
1705
Hanno Becker8cf6b492017-05-08 11:06:19 +01001706 MBEDTLS_SSL_DEBUG_MSG( 1,
1707 ( "non-handshake message during renegotiation" ) );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01001708
1709 ssl->keep_current_message = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001710 return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO );
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001711 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001712#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001713
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001714 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001715 mbedtls_ssl_send_alert_message(
1716 ssl,
1717 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1718 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001719 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001720 }
1721
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001722#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001723 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001724 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001725 if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001726 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001727 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received hello verify request" ) );
1728 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001729 return( ssl_parse_hello_verify_request( ssl ) );
1730 }
1731 else
1732 {
1733 /* We made it through the verification process */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001734 mbedtls_free( ssl->handshake->verify_cookie );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001735 ssl->handshake->verify_cookie = NULL;
1736 ssl->handshake->verify_cookie_len = 0;
1737 }
1738 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001739#endif /* MBEDTLS_SSL_PROTO_DTLS */
Paul Bakker5121ce52009-01-03 21:22:43 +00001740
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001741 if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) ||
1742 buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO )
Paul Bakker5121ce52009-01-03 21:22:43 +00001743 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001744 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001745 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1746 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001747 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001748 }
1749
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001750 /*
1751 * 0 . 1 server_version
1752 * 2 . 33 random (maybe including 4 bytes of Unix time)
1753 * 34 . 34 session_id length = n
1754 * 35 . 34+n session_id
1755 * 35+n . 36+n cipher_suite
1756 * 37+n . 37+n compression_method
1757 *
1758 * 38+n . 39+n extensions length (optional)
1759 * 40+n . .. extensions
1760 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001761 buf += mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001762
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001763 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", buf + 0, 2 );
1764 mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001765 ssl->conf->transport, buf + 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001766
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001767 if( ssl->major_ver < ssl->conf->min_major_ver ||
1768 ssl->minor_ver < ssl->conf->min_minor_ver ||
1769 ssl->major_ver > ssl->conf->max_major_ver ||
1770 ssl->minor_ver > ssl->conf->max_minor_ver )
Paul Bakker1d29fb52012-09-28 13:28:45 +00001771 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001772 MBEDTLS_SSL_DEBUG_MSG( 1,
1773 ( "server version out of bounds - min: [%d:%d], server: [%d:%d], max: [%d:%d]",
1774 ssl->conf->min_major_ver,
1775 ssl->conf->min_minor_ver,
1776 ssl->major_ver, ssl->minor_ver,
1777 ssl->conf->max_major_ver,
1778 ssl->conf->max_minor_ver ) );
Paul Bakker1d29fb52012-09-28 13:28:45 +00001779
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001780 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1781 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Paul Bakker1d29fb52012-09-28 13:28:45 +00001782
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001783 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
Paul Bakker1d29fb52012-09-28 13:28:45 +00001784 }
1785
Andres Amaya Garcia6bce9cb2017-09-06 15:33:34 +01001786 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu",
1787 ( (uint32_t) buf[2] << 24 ) |
1788 ( (uint32_t) buf[3] << 16 ) |
1789 ( (uint32_t) buf[4] << 8 ) |
1790 ( (uint32_t) buf[5] ) ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001791
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001792 memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001793
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001794 n = buf[34];
Paul Bakker5121ce52009-01-03 21:22:43 +00001795
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001796 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 2, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001797
Paul Bakker48916f92012-09-16 19:57:18 +00001798 if( n > 32 )
1799 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001800 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001801 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1802 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001803 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001804 }
1805
Manuel Pégourié-Gonnarda6e5bd52015-07-23 12:14:13 +02001806 if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +00001807 {
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001808 ext_len = ( ( buf[38 + n] << 8 )
1809 | ( buf[39 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001810
Paul Bakker48916f92012-09-16 19:57:18 +00001811 if( ( ext_len > 0 && ext_len < 4 ) ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001812 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len )
Paul Bakker48916f92012-09-16 19:57:18 +00001813 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001814 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001815 mbedtls_ssl_send_alert_message(
1816 ssl,
1817 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1818 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001819 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001820 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001821 }
Manuel Pégourié-Gonnarda6e5bd52015-07-23 12:14:13 +02001822 else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n )
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001823 {
1824 ext_len = 0;
1825 }
1826 else
1827 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001828 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001829 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1830 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001831 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001832 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001833
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001834 /* ciphersuite (used later) */
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001835 i = ( buf[35 + n] << 8 ) | buf[36 + n];
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001836
1837 /*
1838 * Read and check compression
1839 */
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001840 comp = buf[37 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +00001841
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001842#if defined(MBEDTLS_ZLIB_SUPPORT)
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001843 /* See comments in ssl_write_client_hello() */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001844#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001845 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001846 accept_comp = 0;
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001847 else
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001848#endif
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001849 accept_comp = 1;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001850
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001851 if( comp != MBEDTLS_SSL_COMPRESS_NULL &&
1852 ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) )
1853#else /* MBEDTLS_ZLIB_SUPPORT */
1854 if( comp != MBEDTLS_SSL_COMPRESS_NULL )
1855#endif/* MBEDTLS_ZLIB_SUPPORT */
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001856 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001857 MBEDTLS_SSL_DEBUG_MSG( 1,
1858 ( "server hello, bad compression: %d", comp ) );
1859 mbedtls_ssl_send_alert_message(
1860 ssl,
1861 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1862 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001863 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001864 }
1865
Paul Bakker380da532012-04-18 16:10:25 +00001866 /*
1867 * Initialize update checksum functions
1868 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01001869 ssl->transform_negotiate->ciphersuite_info =
1870 mbedtls_ssl_ciphersuite_from_id( i );
Paul Bakker68884e32013-01-07 18:20:04 +01001871
1872 if( ssl->transform_negotiate->ciphersuite_info == NULL )
1873 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001874 MBEDTLS_SSL_DEBUG_MSG( 1,
1875 ( "ciphersuite info for %04x not found", i ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001876 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1877 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001878 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +01001879 }
Paul Bakker380da532012-04-18 16:10:25 +00001880
Hanno Becker8cf6b492017-05-08 11:06:19 +01001881 mbedtls_ssl_optimize_checksum( ssl,
1882 ssl->transform_negotiate->ciphersuite_info );
Manuel Pégourié-Gonnard3c599f12014-03-10 13:25:07 +01001883
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001884 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
1885 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 35, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001886
1887 /*
1888 * Check if the session can be resumed
1889 */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001890 if( ssl->handshake->resume == 0 || n == 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001891#if defined(MBEDTLS_SSL_RENEGOTIATION)
1892 ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001893#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001894 ssl->session_negotiate->ciphersuite != i ||
1895 ssl->session_negotiate->compression != comp ||
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001896 ssl->session_negotiate->id_len != n ||
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001897 memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001898 {
1899 ssl->state++;
Paul Bakker0a597072012-09-25 21:55:46 +00001900 ssl->handshake->resume = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001901#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01001902 ssl->session_negotiate->start = mbedtls_time( NULL );
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001903#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001904 ssl->session_negotiate->ciphersuite = i;
1905 ssl->session_negotiate->compression = comp;
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001906 ssl->session_negotiate->id_len = n;
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001907 memcpy( ssl->session_negotiate->id, buf + 35, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001908 }
1909 else
1910 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001911 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00001912
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001913 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Paul Bakkerff60ee62010-03-16 21:09:09 +00001914 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001915 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001916 mbedtls_ssl_send_alert_message(
1917 ssl,
1918 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1919 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Paul Bakkerff60ee62010-03-16 21:09:09 +00001920 return( ret );
1921 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001922 }
1923
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001924 MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +00001925 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001926
Manuel Pégourié-Gonnard60884a12015-09-16 11:13:41 +02001927 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", i ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001928 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d",
1929 buf[37 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001930
Andrzej Kurek66080962018-04-25 05:06:07 -04001931 /*
1932 * Perform cipher suite validation in same way as in ssl_write_client_hello.
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +01001933 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001934 i = 0;
1935 while( 1 )
1936 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001937 if( ssl->conf->ciphersuite_list[ssl->minor_ver][i] == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001938 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001939 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001940 mbedtls_ssl_send_alert_message(
1941 ssl,
1942 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1943 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001944 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001945 }
1946
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001947 if( ssl->conf->ciphersuite_list[ssl->minor_ver][i++] ==
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001948 ssl->session_negotiate->ciphersuite )
1949 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001950 break;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001951 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001952 }
1953
Hanno Becker8cf6b492017-05-08 11:06:19 +01001954 suite_info = mbedtls_ssl_ciphersuite_from_id(
1955 ssl->session_negotiate->ciphersuite );
1956 if( ssl_validate_ciphersuite( suite_info, ssl, ssl->minor_ver,
1957 ssl->minor_ver ) != 0 )
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +01001958 {
1959 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001960 mbedtls_ssl_send_alert_message(
1961 ssl,
1962 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1963 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +01001964 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1965 }
1966
Hanno Becker8cf6b492017-05-08 11:06:19 +01001967 MBEDTLS_SSL_DEBUG_MSG( 3,
1968 ( "server hello, chosen ciphersuite: %s", suite_info->name ) );
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +01001969
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001970 if( comp != MBEDTLS_SSL_COMPRESS_NULL
1971#if defined(MBEDTLS_ZLIB_SUPPORT)
1972 && comp != MBEDTLS_SSL_COMPRESS_DEFLATE
Paul Bakker2770fbd2012-07-03 13:30:23 +00001973#endif
1974 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001975 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001976 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001977 mbedtls_ssl_send_alert_message(
1978 ssl,
1979 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1980 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001981 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001982 }
Paul Bakker48916f92012-09-16 19:57:18 +00001983 ssl->session_negotiate->compression = comp;
Paul Bakker5121ce52009-01-03 21:22:43 +00001984
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001985 ext = buf + 40 + n;
Paul Bakker48916f92012-09-16 19:57:18 +00001986
Hanno Becker8cf6b492017-05-08 11:06:19 +01001987 MBEDTLS_SSL_DEBUG_MSG( 2,
1988 ( "server hello, total extension length: %d", ext_len ) );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001989
Paul Bakker48916f92012-09-16 19:57:18 +00001990 while( ext_len )
1991 {
1992 unsigned int ext_id = ( ( ext[0] << 8 )
1993 | ( ext[1] ) );
1994 unsigned int ext_size = ( ( ext[2] << 8 )
1995 | ( ext[3] ) );
1996
1997 if( ext_size + 4 > ext_len )
1998 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001999 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002000 mbedtls_ssl_send_alert_message(
2001 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2002 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002003 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00002004 }
2005
2006 switch( ext_id )
2007 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002008 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
2009 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
2010#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00002011 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01002012#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002013
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02002014 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4,
2015 ext_size ) ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00002016 return( ret );
2017
2018 break;
2019
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002020#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2021 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Hanno Becker8cf6b492017-05-08 11:06:19 +01002022 MBEDTLS_SSL_DEBUG_MSG( 3,
2023 ( "found max_fragment_length extension" ) );
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02002024
2025 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
2026 ext + 4, ext_size ) ) != 0 )
2027 {
2028 return( ret );
2029 }
2030
2031 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002032#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02002033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002034#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
2035 case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
2036 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002037
2038 if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
2039 ext + 4, ext_size ) ) != 0 )
2040 {
2041 return( ret );
2042 }
2043
2044 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002045#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002046
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002047#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2048 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
2049 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002050
2051 if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl,
2052 ext + 4, ext_size ) ) != 0 )
2053 {
2054 return( ret );
2055 }
2056
2057 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002058#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002059
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002060#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2061 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Hanno Becker8cf6b492017-05-08 11:06:19 +01002062 MBEDTLS_SSL_DEBUG_MSG( 3,
2063 ( "found extended_master_secret extension" ) );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002064
2065 if( ( ret = ssl_parse_extended_ms_ext( ssl,
2066 ext + 4, ext_size ) ) != 0 )
2067 {
2068 return( ret );
2069 }
2070
2071 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002072#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002073
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002074#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2075 case MBEDTLS_TLS_EXT_SESSION_TICKET:
2076 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02002077
2078 if( ( ret = ssl_parse_session_ticket_ext( ssl,
2079 ext + 4, ext_size ) ) != 0 )
2080 {
2081 return( ret );
2082 }
2083
2084 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002085#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02002086
Robert Cragie136884c2015-10-02 13:34:31 +01002087#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01002088 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002089 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Hanno Becker8cf6b492017-05-08 11:06:19 +01002090 MBEDTLS_SSL_DEBUG_MSG( 3,
2091 ( "found supported_point_formats extension" ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002092
2093 if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
2094 ext + 4, ext_size ) ) != 0 )
2095 {
2096 return( ret );
2097 }
2098
2099 break;
Robert Cragieae8535d2015-10-06 17:11:18 +01002100#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
2101 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002102
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02002103#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2104 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
2105 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) );
2106
2107 if( ( ret = ssl_parse_ecjpake_kkpp( ssl,
2108 ext + 4, ext_size ) ) != 0 )
2109 {
2110 return( ret );
2111 }
2112
2113 break;
2114#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002116#if defined(MBEDTLS_SSL_ALPN)
2117 case MBEDTLS_TLS_EXT_ALPN:
2118 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002119
2120 if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 )
2121 return( ret );
2122
2123 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002124#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002125
Paul Bakker48916f92012-09-16 19:57:18 +00002126 default:
Hanno Becker8cf6b492017-05-08 11:06:19 +01002127 MBEDTLS_SSL_DEBUG_MSG( 3,
2128 ( "unknown extension found: %d (ignoring)", ext_id ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002129 }
2130
2131 ext_len -= 4 + ext_size;
2132 ext += 4 + ext_size;
2133
2134 if( ext_len > 0 && ext_len < 4 )
2135 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002136 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
2137 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00002138 }
2139 }
2140
2141 /*
2142 * Renegotiation security checks
2143 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002144 if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Hanno Becker8cf6b492017-05-08 11:06:19 +01002145 ssl->conf->allow_legacy_renegotiation ==
2146 MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00002147 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002148 MBEDTLS_SSL_DEBUG_MSG( 1,
2149 ( "legacy renegotiation, breaking off handshake" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002150 handshake_failure = 1;
2151 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002152#if defined(MBEDTLS_SSL_RENEGOTIATION)
2153 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2154 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Paul Bakker48916f92012-09-16 19:57:18 +00002155 renegotiation_info_seen == 0 )
2156 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002157 MBEDTLS_SSL_DEBUG_MSG( 1,
2158 ( "renegotiation_info extension missing (secure)" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002159 handshake_failure = 1;
2160 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002161 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2162 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Hanno Becker8cf6b492017-05-08 11:06:19 +01002163 ssl->conf->allow_legacy_renegotiation ==
2164 MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00002165 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002166 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002167 handshake_failure = 1;
2168 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002169 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2170 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002171 renegotiation_info_seen == 1 )
2172 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002173 MBEDTLS_SSL_DEBUG_MSG( 1,
2174 ( "renegotiation_info extension present (legacy)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002175 handshake_failure = 1;
2176 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002177#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002178
2179 if( handshake_failure == 1 )
2180 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002181 mbedtls_ssl_send_alert_message(
2182 ssl,
2183 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2184 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002185 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00002186 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002187
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002188 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002189
2190 return( 0 );
2191}
2192
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002193#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2194 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Hanno Becker8cf6b492017-05-08 11:06:19 +01002195static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl,
2196 unsigned char **p,
Paul Bakker29e1f122013-04-16 13:07:56 +02002197 unsigned char *end )
2198{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002199 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker29e1f122013-04-16 13:07:56 +02002200
Paul Bakker29e1f122013-04-16 13:07:56 +02002201 /*
2202 * Ephemeral DH parameters:
2203 *
2204 * struct {
2205 * opaque dh_p<1..2^16-1>;
2206 * opaque dh_g<1..2^16-1>;
2207 * opaque dh_Ys<1..2^16-1>;
2208 * } ServerDHParams;
2209 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01002210 if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx,
2211 p, end ) ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002212 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002213 MBEDTLS_SSL_DEBUG_RET( 2, ( "mbedtls_dhm_read_params" ), ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002214 return( ret );
2215 }
2216
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02002217 if( ssl->handshake->dhm_ctx.len * 8 < ssl->conf->dhm_min_bitlen )
Paul Bakker29e1f122013-04-16 13:07:56 +02002218 {
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02002219 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHM prime too short: %d < %d",
2220 ssl->handshake->dhm_ctx.len * 8,
2221 ssl->conf->dhm_min_bitlen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002222 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002223 }
2224
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002225 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
2226 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
2227 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +02002228
2229 return( ret );
2230}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002231#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2232 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002233
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002234#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2235 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2236 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
2237 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2238 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2239static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002240{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002241 const mbedtls_ecp_curve_info *curve_info;
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002243 curve_info = mbedtls_ecp_curve_info_from_grp_id( ssl->handshake->ecdh_ctx.grp.id );
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002244 if( curve_info == NULL )
2245 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002246 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2247 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002248 }
2249
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002250 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002251
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02002252#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02002253 if( mbedtls_ssl_check_curve( ssl, ssl->handshake->ecdh_ctx.grp.id ) != 0 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002254#else
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002255 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
2256 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002257#endif
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002258 return( -1 );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002259
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002260 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002261
2262 return( 0 );
2263}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002264#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2265 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2266 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2267 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2268 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002269
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002270#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2271 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2272 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2273static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
Paul Bakker29e1f122013-04-16 13:07:56 +02002274 unsigned char **p,
2275 unsigned char *end )
2276{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002277 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker29e1f122013-04-16 13:07:56 +02002278
Paul Bakker29e1f122013-04-16 13:07:56 +02002279 /*
2280 * Ephemeral ECDH parameters:
2281 *
2282 * struct {
2283 * ECParameters curve_params;
2284 * ECPoint public;
2285 * } ServerECDHParams;
2286 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002287 if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx,
Paul Bakker29e1f122013-04-16 13:07:56 +02002288 (const unsigned char **) p, end ) ) != 0 )
2289 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002290 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_read_params" ), ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002291 return( ret );
2292 }
2293
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002294 if( ssl_check_server_ecdh_params( ssl ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002295 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002296 MBEDTLS_SSL_DEBUG_MSG( 1,
2297 ( "bad server key exchange message (ECDHE curve)" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002298 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002299 }
2300
Paul Bakker29e1f122013-04-16 13:07:56 +02002301 return( ret );
2302}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002303#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2304 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2305 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002306
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002307#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
2308static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002309 unsigned char **p,
2310 unsigned char *end )
2311{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002312 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002313 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02002314 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002315
2316 /*
2317 * PSK parameters:
2318 *
2319 * opaque psk_identity_hint<0..2^16-1>;
2320 */
Hanno Becker63c706f2018-10-08 13:40:50 +01002321 if( end - (*p) < 2 )
Krzysztof Stachowiak9e1839b2018-03-14 11:20:46 +01002322 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002323 MBEDTLS_SSL_DEBUG_MSG( 1,
2324 ( "bad server key exchange message (psk_identity_hint length)" ) );
Krzysztof Stachowiak9e1839b2018-03-14 11:20:46 +01002325 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2326 }
Manuel Pégourié-Gonnard59b9fe22013-10-15 11:55:33 +02002327 len = (*p)[0] << 8 | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002328 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002329
Hanno Beckerd72fab92018-10-10 15:48:39 +01002330 if( end - (*p) < (int) len )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002331 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002332 MBEDTLS_SSL_DEBUG_MSG( 1,
2333 ( "bad server key exchange message (psk_identity_hint length)" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002334 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002335 }
2336
Manuel Pégourié-Gonnard9d624122016-02-22 11:10:14 +01002337 /*
2338 * Note: we currently ignore the PKS identity hint, as we only allow one
2339 * PSK to be provisionned on the client. This could be changed later if
2340 * someone needs that feature.
2341 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002342 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002343 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002344
2345 return( ret );
2346}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002347#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002349#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
2350 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002351/*
2352 * Generate a pre-master secret and encrypt it with the server's RSA key
2353 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002354static int ssl_write_encrypted_pms( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002355 size_t offset, size_t *olen,
2356 size_t pms_offset )
2357{
2358 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002359 size_t len_bytes = ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002360 unsigned char *p = ssl->handshake->premaster + pms_offset;
2361
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02002362 if( offset + len_bytes > MBEDTLS_SSL_MAX_CONTENT_LEN )
2363 {
2364 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) );
2365 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2366 }
2367
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002368 /*
2369 * Generate (part of) the pre-master as
2370 * struct {
2371 * ProtocolVersion client_version;
2372 * opaque random[46];
2373 * } PreMasterSecret;
2374 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01002375 mbedtls_ssl_write_version( ssl->conf->max_major_ver,
2376 ssl->conf->max_minor_ver,
2377 ssl->conf->transport, p );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002378
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002379 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p + 2, 46 ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002380 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002381 MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002382 return( ret );
2383 }
2384
2385 ssl->handshake->pmslen = 48;
2386
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002387 if( ssl->session_negotiate->peer_cert == NULL )
2388 {
2389 MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
2390 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
2391 }
2392
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002393 /*
2394 * Now write it out, encrypted
2395 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002396 if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
2397 MBEDTLS_PK_RSA ) )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002398 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002399 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
2400 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002401 }
2402
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002403 if( ( ret = mbedtls_pk_encrypt( &ssl->session_negotiate->peer_cert->pk,
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002404 p, ssl->handshake->pmslen,
2405 ssl->out_msg + offset + len_bytes, olen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002406 MBEDTLS_SSL_MAX_CONTENT_LEN - offset - len_bytes,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002407 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002408 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002409 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_rsa_pkcs1_encrypt", ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002410 return( ret );
2411 }
2412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002413#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2414 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002415 if( len_bytes == 2 )
2416 {
2417 ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 );
2418 ssl->out_msg[offset+1] = (unsigned char)( *olen );
2419 *olen += 2;
2420 }
2421#endif
2422
2423 return( 0 );
2424}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002425#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
2426 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002427
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002428#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard5c2a7ca2015-10-23 08:48:41 +02002429#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2430 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2431 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002432static int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl,
Paul Bakker29e1f122013-04-16 13:07:56 +02002433 unsigned char **p,
2434 unsigned char *end,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002435 mbedtls_md_type_t *md_alg,
2436 mbedtls_pk_type_t *pk_alg )
Paul Bakker29e1f122013-04-16 13:07:56 +02002437{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02002438 ((void) ssl);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002439 *md_alg = MBEDTLS_MD_NONE;
2440 *pk_alg = MBEDTLS_PK_NONE;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002441
2442 /* Only in TLS 1.2 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002443 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002444 {
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002445 return( 0 );
2446 }
Paul Bakker29e1f122013-04-16 13:07:56 +02002447
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002448 if( (*p) + 2 > end )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002449 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002450
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002451 /*
2452 * Get hash algorithm
2453 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01002454 if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) )
2455 == MBEDTLS_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002456 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002457 MBEDTLS_SSL_DEBUG_MSG( 1,
2458 ( "Server used unsupported HashAlgorithm %d", *(p)[0] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002459 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002460 }
2461
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002462 /*
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002463 * Get signature algorithm
2464 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01002465 if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) )
2466 == MBEDTLS_PK_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002467 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002468 MBEDTLS_SSL_DEBUG_MSG( 1,
2469 ( "server used unsupported SignatureAlgorithm %d", (*p)[1] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002470 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002471 }
2472
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02002473 /*
2474 * Check if the hash is acceptable
2475 */
2476 if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 )
2477 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002478 MBEDTLS_SSL_DEBUG_MSG( 1,
2479 ( "server used HashAlgorithm %d that was not offered", *(p)[0] ) );
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02002480 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2481 }
2482
Hanno Becker8cf6b492017-05-08 11:06:19 +01002483 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d",
2484 (*p)[1] ) );
2485 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d",
2486 (*p)[0] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02002487 *p += 2;
2488
2489 return( 0 );
2490}
Manuel Pégourié-Gonnard5c2a7ca2015-10-23 08:48:41 +02002491#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2492 MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2493 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002494#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02002495
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002496#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2497 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2498static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002499{
2500 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002501 const mbedtls_ecp_keypair *peer_key;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002502
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002503 if( ssl->session_negotiate->peer_cert == NULL )
2504 {
2505 MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
2506 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
2507 }
2508
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002509 if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
2510 MBEDTLS_PK_ECKEY ) )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002511 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002512 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
2513 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002514 }
2515
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002516 peer_key = mbedtls_pk_ec( ssl->session_negotiate->peer_cert->pk );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002517
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002518 if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,
2519 MBEDTLS_ECDH_THEIRS ) ) != 0 )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002520 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002521 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002522 return( ret );
2523 }
2524
2525 if( ssl_check_server_ecdh_params( ssl ) != 0 )
2526 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002527 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) );
2528 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002529 }
2530
2531 return( ret );
2532}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002533#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2534 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002535
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002536static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
Paul Bakker41c83d32013-03-20 14:39:14 +01002537{
Paul Bakker23986e52011-04-24 08:57:21 +00002538 int ret;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002539 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2540 ssl->transform_negotiate->ciphersuite_info;
Andres Amaya Garcia53c77cc2017-06-27 16:15:06 +01002541 unsigned char *p = NULL, *end = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00002542
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002543 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002544
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002545#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
2546 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00002547 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002548 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002549 ssl->state++;
2550 return( 0 );
2551 }
Manuel Pégourié-Gonnardbac0e3b2013-10-15 11:54:47 +02002552 ((void) p);
2553 ((void) end);
2554#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002555
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002556#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2557 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2558 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
2559 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002560 {
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002561 if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 )
2562 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002563 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002564 mbedtls_ssl_send_alert_message(
2565 ssl,
2566 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2567 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002568 return( ret );
2569 }
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002570
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002571 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002572 ssl->state++;
2573 return( 0 );
2574 }
2575 ((void) p);
2576 ((void) end);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002577#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2578 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002579
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002580 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002581 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002582 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002583 return( ret );
2584 }
2585
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002586 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002587 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002588 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002589 mbedtls_ssl_send_alert_message(
2590 ssl,
2591 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2592 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002593 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002594 }
2595
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002596 /*
2597 * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
2598 * doesn't use a psk_identity_hint
2599 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002600 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002601 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002602 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2603 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Paul Bakker188c8de2013-04-19 09:13:37 +02002604 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002605 /* Current message is probably either
2606 * CertificateRequest or ServerHelloDone */
2607 ssl->keep_current_message = 1;
Paul Bakker188c8de2013-04-19 09:13:37 +02002608 goto exit;
2609 }
2610
Hanno Becker8cf6b492017-05-08 11:06:19 +01002611 MBEDTLS_SSL_DEBUG_MSG( 1,
2612 ( "server key exchange message must not be skipped" ) );
2613 mbedtls_ssl_send_alert_message(
2614 ssl,
2615 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2616 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002617
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002618 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002619 }
2620
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002621 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Paul Bakker3b6a07b2013-03-21 11:56:50 +01002622 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002623 MBEDTLS_SSL_DEBUG_BUF( 3, "server key exchange", p, end - p );
Paul Bakker3b6a07b2013-03-21 11:56:50 +01002624
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002625#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
2626 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2627 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
2628 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2629 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002630 {
2631 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
2632 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002633 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002634 mbedtls_ssl_send_alert_message(
2635 ssl,
2636 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2637 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002638 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002639 }
2640 } /* FALLTROUGH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002641#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002642
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002643#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \
2644 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
2645 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2646 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002647 ; /* nothing more to do */
2648 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002649#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||
2650 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
2651#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2652 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
2653 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
2654 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00002655 {
Paul Bakker29e1f122013-04-16 13:07:56 +02002656 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01002657 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002658 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002659 mbedtls_ssl_send_alert_message(
2660 ssl,
2661 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2662 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002663 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002664 }
2665 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002666 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002667#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2668 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
2669#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2670 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
2671 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
2672 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
2673 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
2674 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002675 {
2676 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
2677 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002678 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002679 mbedtls_ssl_send_alert_message(
2680 ssl,
2681 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2682 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002683 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker41c83d32013-03-20 14:39:14 +01002684 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002685 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002686 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002687#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2688 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2689 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002690#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2691 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
2692 {
2693 ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
2694 p, end - p );
2695 if( ret != 0 )
2696 {
2697 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002698 mbedtls_ssl_send_alert_message(
2699 ssl,
2700 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2701 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002702 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2703 }
2704 }
2705 else
2706#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002707 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002708 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2709 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002710 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002711
Hanno Becker1aa267c2017-04-28 17:08:27 +01002712#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)
2713 if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002714 {
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00002715 size_t sig_len, hashlen;
2716 unsigned char hash[64];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002717 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
2718 mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
2719 unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00002720 size_t params_len = p - params;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002721
Paul Bakker29e1f122013-04-16 13:07:56 +02002722 /*
2723 * Handle the digitally-signed structure
2724 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002725#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2726 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002727 {
Paul Bakker9659dae2013-08-28 16:21:34 +02002728 if( ssl_parse_signature_algorithm( ssl, &p, end,
2729 &md_alg, &pk_alg ) != 0 )
2730 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002731 MBEDTLS_SSL_DEBUG_MSG( 1,
2732 ( "bad server key exchange message" ) );
2733 mbedtls_ssl_send_alert_message(
2734 ssl,
2735 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2736 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002737 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker9659dae2013-08-28 16:21:34 +02002738 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002739
Hanno Becker8cf6b492017-05-08 11:06:19 +01002740 if( pk_alg !=
2741 mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002742 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002743 MBEDTLS_SSL_DEBUG_MSG( 1,
2744 ( "bad server key exchange message" ) );
2745 mbedtls_ssl_send_alert_message(
2746 ssl,
2747 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2748 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002749 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002750 }
2751 }
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02002752 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002753#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2754#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2755 defined(MBEDTLS_SSL_PROTO_TLS1_1)
2756 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02002757 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002758 pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002759
Paul Bakker9659dae2013-08-28 16:21:34 +02002760 /* Default hash for ECDSA is SHA-1 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002761 if( pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE )
2762 md_alg = MBEDTLS_MD_SHA1;
Paul Bakker9659dae2013-08-28 16:21:34 +02002763 }
2764 else
2765#endif
2766 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002767 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2768 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker9659dae2013-08-28 16:21:34 +02002769 }
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002770
2771 /*
2772 * Read signature
2773 */
Krzysztof Stachowiakb3e8f9e2018-03-14 11:40:55 +01002774 if( p > end - 2 )
2775 {
2776 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002777 mbedtls_ssl_send_alert_message(
2778 ssl,
2779 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2780 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Krzysztof Stachowiakb3e8f9e2018-03-14 11:40:55 +01002781 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2782 }
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002783 sig_len = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00002784 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002785
Krzysztof Stachowiakb5609f32018-03-14 11:41:47 +01002786 if( p != end - sig_len )
Paul Bakker41c83d32013-03-20 14:39:14 +01002787 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002788 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002789 mbedtls_ssl_send_alert_message(
2790 ssl,
2791 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2792 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002793 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker41c83d32013-03-20 14:39:14 +01002794 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002795
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002796 MBEDTLS_SSL_DEBUG_BUF( 3, "signature", p, sig_len );
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02002797
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002798 /*
2799 * Compute the hash that has been signed
2800 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002801#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2802 defined(MBEDTLS_SSL_PROTO_TLS1_1)
2803 if( md_alg == MBEDTLS_MD_NONE )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00002804 {
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002805 hashlen = 36;
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01002806 ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash, params,
2807 params_len );
2808 if( ret != 0 )
Andres Amaya Garciaf0e521e2017-06-28 12:11:42 +01002809 return( ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002810 }
2811 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002812#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
2813 MBEDTLS_SSL_PROTO_TLS1_1 */
2814#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2815 defined(MBEDTLS_SSL_PROTO_TLS1_2)
2816 if( md_alg != MBEDTLS_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002817 {
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002818 /* Info from md_alg will be used instead */
2819 hashlen = 0;
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01002820 ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, params,
2821 params_len, md_alg );
2822 if( ret != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002823 return( ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002824 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002825 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002826#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
2827 MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02002828 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002829 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2830 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02002831 }
Paul Bakker29e1f122013-04-16 13:07:56 +02002832
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002833 MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen != 0 ? hashlen :
2834 (unsigned int) ( mbedtls_md_get_size( mbedtls_md_info_from_type( md_alg ) ) ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02002835
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002836 if( ssl->session_negotiate->peer_cert == NULL )
2837 {
2838 MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002839 mbedtls_ssl_send_alert_message(
2840 ssl,
2841 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2842 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002843 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
2844 }
2845
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002846 /*
2847 * Verify signature
2848 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01002849 if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
2850 pk_alg ) )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002851 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002852 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002853 mbedtls_ssl_send_alert_message(
2854 ssl,
2855 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2856 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002857 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002858 }
2859
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002860 if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk,
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02002861 md_alg, hash, hashlen, p, sig_len ) ) != 0 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002862 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002863 mbedtls_ssl_send_alert_message(
2864 ssl,
2865 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2866 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002867 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02002868 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00002869 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002870 }
Hanno Becker1aa267c2017-04-28 17:08:27 +01002871#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002872
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002873exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00002874 ssl->state++;
2875
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002876 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002877
2878 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002879}
2880
Hanno Becker1aa267c2017-04-28 17:08:27 +01002881#if ! defined(MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002882static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002883{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002884 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2885 ssl->transform_negotiate->ciphersuite_info;
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002886
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002887 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002888
Hanno Becker1aa267c2017-04-28 17:08:27 +01002889 if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002890 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002891 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002892 ssl->state++;
2893 return( 0 );
2894 }
2895
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002896 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2897 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002898}
Hanno Becker1aa267c2017-04-28 17:08:27 +01002899#else /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002900static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002901{
2902 int ret;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002903 unsigned char *buf;
2904 size_t n = 0;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002905 size_t cert_type_len = 0, dn_len = 0;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002906 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2907 ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002908
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002909 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002910
Hanno Becker1aa267c2017-04-28 17:08:27 +01002911 if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002912 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002913 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002914 ssl->state++;
2915 return( 0 );
2916 }
2917
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002918 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002919 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002920 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
2921 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002922 }
2923
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002924 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
2925 {
2926 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002927 mbedtls_ssl_send_alert_message(
2928 ssl,
2929 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2930 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002931 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
2932 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002933
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002934 ssl->state++;
2935 ssl->client_auth = ( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST );
Paul Bakker5121ce52009-01-03 21:22:43 +00002936
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002937 MBEDTLS_SSL_DEBUG_MSG( 3, ( "got %s certificate request",
Paul Bakker5121ce52009-01-03 21:22:43 +00002938 ssl->client_auth ? "a" : "no" ) );
2939
Paul Bakker926af752012-11-23 13:38:07 +01002940 if( ssl->client_auth == 0 )
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002941 {
2942 /* Current message is probably the ServerHelloDone */
2943 ssl->keep_current_message = 1;
Paul Bakker926af752012-11-23 13:38:07 +01002944 goto exit;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002945 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002946
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02002947 /*
2948 * struct {
2949 * ClientCertificateType certificate_types<1..2^8-1>;
2950 * SignatureAndHashAlgorithm
2951 * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only
2952 * DistinguishedName certificate_authorities<0..2^16-1>;
2953 * } CertificateRequest;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002954 *
2955 * Since we only support a single certificate on clients, let's just
2956 * ignore all the information that's supposed to help us pick a
2957 * certificate.
2958 *
2959 * We could check that our certificate matches the request, and bail out
2960 * if it doesn't, but it's simpler to just send the certificate anyway,
2961 * and give the server the opportunity to decide if it should terminate
2962 * the connection when it doesn't like our certificate.
2963 *
2964 * Same goes for the hash in TLS 1.2's signature_algorithms: at this
2965 * point we only have one hash available (see comments in
Simon Butcherc0957bd2016-03-01 13:16:57 +00002966 * write_certificate_verify), so let's just use what we have.
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002967 *
2968 * However, we still minimally parse the message to check it is at least
2969 * superficially sane.
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02002970 */
Paul Bakker926af752012-11-23 13:38:07 +01002971 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002972
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002973 /* certificate_types */
Krzysztof Stachowiak314f1612018-04-05 10:20:09 +02002974 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) )
2975 {
2976 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
2977 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2978 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
2979 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
2980 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002981 cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )];
Paul Bakker926af752012-11-23 13:38:07 +01002982 n = cert_type_len;
2983
Krzysztof Stachowiak3d8663b2018-03-20 11:19:50 +01002984 /*
Krzysztof Stachowiakaffb4f82018-04-05 14:48:55 +02002985 * In the subsequent code there are two paths that read from buf:
Krzysztof Stachowiak3d8663b2018-03-20 11:19:50 +01002986 * * the length of the signature algorithms field (if minor version of
2987 * SSL is 3),
2988 * * distinguished name length otherwise.
2989 * Both reach at most the index:
2990 * ...hdr_len + 2 + n,
2991 * therefore the buffer length at this point must be greater than that
2992 * regardless of the actual code path.
2993 */
Hanno Becker78d5d822018-08-16 15:51:34 +01002994 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
Paul Bakker926af752012-11-23 13:38:07 +01002995 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002996 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002997 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2998 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002999 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
Paul Bakker926af752012-11-23 13:38:07 +01003000 }
3001
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003002 /* supported_signature_algorithms */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003003#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3004 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01003005 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01003006 size_t sig_alg_len =
3007 ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
3008 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
Simon Butcher99000142016-10-13 17:21:01 +01003009#if defined(MBEDTLS_DEBUG_C)
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003010 unsigned char* sig_alg;
Simon Butcher99000142016-10-13 17:21:01 +01003011 size_t i;
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003012#endif
Simon Butcher99000142016-10-13 17:21:01 +01003013
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003014 /*
Krzysztof Stachowiakaffb4f82018-04-05 14:48:55 +02003015 * The furthest access in buf is in the loop few lines below:
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003016 * sig_alg[i + 1],
3017 * where:
3018 * sig_alg = buf + ...hdr_len + 3 + n,
3019 * max(i) = sig_alg_len - 1.
Krzysztof Stachowiakaffb4f82018-04-05 14:48:55 +02003020 * Therefore the furthest access is:
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003021 * buf[...hdr_len + 3 + n + sig_alg_len - 1 + 1],
3022 * which reduces to:
3023 * buf[...hdr_len + 3 + n + sig_alg_len],
3024 * which is one less than we need the buf to be.
3025 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01003026 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl )
3027 + 3 + n + sig_alg_len )
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003028 {
3029 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01003030 mbedtls_ssl_send_alert_message(
3031 ssl,
3032 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3033 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003034 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
3035 }
3036
3037#if defined(MBEDTLS_DEBUG_C)
3038 sig_alg = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n;
Simon Butcher99000142016-10-13 17:21:01 +01003039 for( i = 0; i < sig_alg_len; i += 2 )
3040 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01003041 MBEDTLS_SSL_DEBUG_MSG( 3,
3042 ( "Supported Signature Algorithm found: %d,%d",
3043 sig_alg[i], sig_alg[i + 1] ) );
Simon Butcher99000142016-10-13 17:21:01 +01003044 }
3045#endif
Paul Bakker926af752012-11-23 13:38:07 +01003046
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003047 n += 2 + sig_alg_len;
Paul Bakkerf7abd422013-04-16 13:15:56 +02003048 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003049#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker926af752012-11-23 13:38:07 +01003050
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003051 /* certificate_authorities */
3052 dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
3053 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01003054
3055 n += dn_len;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003056 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n )
Paul Bakker926af752012-11-23 13:38:07 +01003057 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003058 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003059 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3060 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003061 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
Paul Bakker926af752012-11-23 13:38:07 +01003062 }
3063
3064exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003065 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003066
3067 return( 0 );
3068}
Hanno Becker1aa267c2017-04-28 17:08:27 +01003069#endif /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003070
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003071static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003072{
3073 int ret;
3074
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003075 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003076
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003077 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003078 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003079 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3080 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003081 }
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003082
3083 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
3084 {
3085 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
3086 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
3087 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003089 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ||
3090 ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003091 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003092 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003093 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3094 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003095 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003096 }
3097
3098 ssl->state++;
3099
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003100#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003101 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003102 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003103#endif
3104
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003105 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003106
3107 return( 0 );
3108}
3109
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003110static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003111{
Paul Bakker23986e52011-04-24 08:57:21 +00003112 int ret;
3113 size_t i, n;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003114 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3115 ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003116
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003117 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003118
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003119#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
3120 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003121 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003122 /*
3123 * DHM key exchange -- send G^X mod P
3124 */
Paul Bakker48916f92012-09-16 19:57:18 +00003125 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00003126
3127 ssl->out_msg[4] = (unsigned char)( n >> 8 );
3128 ssl->out_msg[5] = (unsigned char)( n );
3129 i = 6;
3130
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003131 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
Hanno Becker8cf6b492017-05-08 11:06:19 +01003132 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
3133 &ssl->out_msg[i], n,
3134 ssl->conf->f_rng, ssl->conf->p_rng );
Paul Bakker5121ce52009-01-03 21:22:43 +00003135 if( ret != 0 )
3136 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003137 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003138 return( ret );
3139 }
3140
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003141 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
3142 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00003143
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003144 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
Hanno Becker8cf6b492017-05-08 11:06:19 +01003145 ssl->handshake->premaster,
3146 MBEDTLS_PREMASTER_SIZE,
3147 &ssl->handshake->pmslen,
3148 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003149 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003150 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003151 return( ret );
3152 }
3153
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003154 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00003155 }
3156 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003157#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
3158#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3159 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3160 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3161 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
3162 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3163 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3164 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
3165 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01003166 {
3167 /*
3168 * ECDH key exchange -- send client public value
3169 */
3170 i = 4;
3171
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003172 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,
Paul Bakker41c83d32013-03-20 14:39:14 +01003173 &n,
3174 &ssl->out_msg[i], 1000,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003175 ssl->conf->f_rng, ssl->conf->p_rng );
Paul Bakker41c83d32013-03-20 14:39:14 +01003176 if( ret != 0 )
3177 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003178 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01003179 return( ret );
3180 }
3181
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003182 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
Paul Bakker41c83d32013-03-20 14:39:14 +01003183
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003184 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
Hanno Becker8cf6b492017-05-08 11:06:19 +01003185 &ssl->handshake->pmslen,
3186 ssl->handshake->premaster,
3187 MBEDTLS_MPI_MAX_SIZE,
3188 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003189 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003190 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01003191 return( ret );
3192 }
3193
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003194 MBEDTLS_SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
Paul Bakker41c83d32013-03-20 14:39:14 +01003195 }
3196 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003197#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3198 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3199 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3200 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3201#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Hanno Becker1aa267c2017-04-28 17:08:27 +01003202 if( mbedtls_ssl_ciphersuite_uses_psk( ciphersuite_info ) )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003203 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003204 /*
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003205 * opaque psk_identity<0..2^16-1>;
3206 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003207 if( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL )
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003208 {
3209 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for PSK" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003210 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003211 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003212
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003213 i = 4;
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003214 n = ssl->conf->psk_identity_len;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003215
3216 if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )
3217 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01003218 MBEDTLS_SSL_DEBUG_MSG( 1,
3219 ( "psk identity too long or SSL buffer too short" ) );
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003220 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3221 }
3222
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003223 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
3224 ssl->out_msg[i++] = (unsigned char)( n );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003225
Hanno Becker8cf6b492017-05-08 11:06:19 +01003226 memcpy( ssl->out_msg + i,
3227 ssl->conf->psk_identity,
3228 ssl->conf->psk_identity_len );
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003229 i += ssl->conf->psk_identity_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003230
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003231#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
3232 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003233 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003234 n = 0;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003235 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003236 else
3237#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003238#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
3239 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003240 {
3241 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 2 ) ) != 0 )
3242 return( ret );
3243 }
3244 else
3245#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003246#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3247 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003248 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003249 /*
3250 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
3251 */
3252 n = ssl->handshake->dhm_ctx.len;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003253
3254 if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )
3255 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01003256 MBEDTLS_SSL_DEBUG_MSG( 1,
3257 ( "psk identity or DHM size too long or SSL buffer too short" ) );
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003258 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3259 }
3260
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003261 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
3262 ssl->out_msg[i++] = (unsigned char)( n );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003263
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003264 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
3265 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003266 &ssl->out_msg[i], n,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003267 ssl->conf->f_rng, ssl->conf->p_rng );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003268 if( ret != 0 )
3269 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003270 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003271 return( ret );
3272 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003273 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003274 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003275#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
3276#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
3277 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003278 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003279 /*
3280 * ClientECDiffieHellmanPublic public;
3281 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003282 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n,
3283 &ssl->out_msg[i], MBEDTLS_SSL_MAX_CONTENT_LEN - i,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003284 ssl->conf->f_rng, ssl->conf->p_rng );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003285 if( ret != 0 )
3286 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003287 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003288 return( ret );
3289 }
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003290
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003291 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003292 }
3293 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003294#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003295 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003296 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3297 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003298 }
3299
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003300 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003301 ciphersuite_info->key_exchange ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003302 {
Ronald Cron904775d2020-06-11 09:34:06 +02003303 MBEDTLS_SSL_DEBUG_RET( 1,
3304 "mbedtls_ssl_psk_derive_premaster", ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003305 return( ret );
3306 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003307 }
3308 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003309#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
3310#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
3311 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003312 {
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003313 i = 4;
3314 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 0 ) ) != 0 )
Paul Bakkera3d195c2011-11-27 21:07:34 +00003315 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003316 }
Paul Bakkered27a042013-04-18 22:46:23 +02003317 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003318#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003319#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
3320 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
3321 {
3322 i = 4;
3323
3324 ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
3325 ssl->out_msg + i, MBEDTLS_SSL_MAX_CONTENT_LEN - i, &n,
3326 ssl->conf->f_rng, ssl->conf->p_rng );
3327 if( ret != 0 )
3328 {
3329 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
3330 return( ret );
3331 }
3332
3333 ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
3334 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
3335 ssl->conf->f_rng, ssl->conf->p_rng );
3336 if( ret != 0 )
3337 {
3338 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
3339 return( ret );
3340 }
3341 }
3342 else
3343#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02003344 {
3345 ((void) ciphersuite_info);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003346 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3347 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakkered27a042013-04-18 22:46:23 +02003348 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003349
Paul Bakker5121ce52009-01-03 21:22:43 +00003350 ssl->out_msglen = i + n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003351 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3352 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003353
3354 ssl->state++;
3355
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003356 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003357 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003358 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003359 return( ret );
3360 }
3361
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003362 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003363
3364 return( 0 );
3365}
3366
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003367#if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
3368 !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
Paul Bakker29f221f2016-07-22 13:49:02 +01003369 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003370 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
Paul Bakker29f221f2016-07-22 13:49:02 +01003371 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003372 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
3373static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003374{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003375 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3376 ssl->transform_negotiate->ciphersuite_info;
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003377 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003378
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003379 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003380
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003381 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003382 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003383 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003384 return( ret );
3385 }
3386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003387 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
3388 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3389 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
Manuel Pégourié-Gonnard25dbeb02015-09-16 17:30:03 +02003390 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
3391 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Paul Bakkered27a042013-04-18 22:46:23 +02003392 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003393 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakkered27a042013-04-18 22:46:23 +02003394 ssl->state++;
3395 return( 0 );
3396 }
3397
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003398 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3399 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003400}
3401#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003402static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003403{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003404 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003405 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3406 ssl->transform_negotiate->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003407 size_t n = 0, offset = 0;
3408 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003409 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003410 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02003411 unsigned int hashlen;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003413 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003414
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003415 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003416 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003417 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003418 return( ret );
3419 }
3420
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003421 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
3422 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3423 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
Manuel Pégourié-Gonnard25dbeb02015-09-16 17:30:03 +02003424 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
3425 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003426 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003427 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003428 ssl->state++;
3429 return( 0 );
3430 }
3431
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003432 if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003433 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003434 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003435 ssl->state++;
3436 return( 0 );
3437 }
3438
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003439 if( mbedtls_ssl_own_key( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003440 {
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003441 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for certificate" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003442 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003443 }
3444
3445 /*
3446 * Make an RSA signature of the handshake digests
3447 */
Paul Bakker48916f92012-09-16 19:57:18 +00003448 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00003449
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003450#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3451 defined(MBEDTLS_SSL_PROTO_TLS1_1)
3452 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003453 {
Paul Bakker926af752012-11-23 13:38:07 +01003454 /*
3455 * digitally-signed struct {
3456 * opaque md5_hash[16];
3457 * opaque sha_hash[20];
3458 * };
3459 *
3460 * md5_hash
3461 * MD5(handshake_messages);
3462 *
3463 * sha_hash
3464 * SHA(handshake_messages);
3465 */
3466 hashlen = 36;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003467 md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003468
3469 /*
3470 * For ECDSA, default hash is SHA-1 only
3471 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003472 if( mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003473 {
3474 hash_start += 16;
3475 hashlen -= 16;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003476 md_alg = MBEDTLS_MD_SHA1;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003477 }
Paul Bakker926af752012-11-23 13:38:07 +01003478 }
3479 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003480#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
3481 MBEDTLS_SSL_PROTO_TLS1_1 */
3482#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3483 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01003484 {
3485 /*
3486 * digitally-signed struct {
3487 * opaque handshake_messages[handshake_messages_length];
3488 * };
3489 *
3490 * Taking shortcut here. We assume that the server always allows the
3491 * PRF Hash function and has sent it in the allowed signature
3492 * algorithms list received in the Certificate Request message.
3493 *
3494 * Until we encounter a server that does not, we will take this
3495 * shortcut.
3496 *
Hanno Becker8cf6b492017-05-08 11:06:19 +01003497 * Reason: Otherwise we should have running hashes for SHA512 and
3498 * SHA224 in order to satisfy 'weird' needs from the server
3499 * side.
Paul Bakker926af752012-11-23 13:38:07 +01003500 */
Paul Bakkerb7149bc2013-03-20 15:30:09 +01003501 if( ssl->transform_negotiate->ciphersuite_info->mac ==
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003502 MBEDTLS_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00003503 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003504 md_alg = MBEDTLS_MD_SHA384;
3505 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00003506 }
3507 else
3508 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003509 md_alg = MBEDTLS_MD_SHA256;
3510 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00003511 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003512 ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003513
Manuel Pégourié-Gonnardbfe32ef2013-08-22 14:55:30 +02003514 /* Info from md_alg will be used instead */
3515 hashlen = 0;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003516 offset = 2;
3517 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003518 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003519#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02003520 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003521 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3522 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02003523 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003524
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003525 if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ), md_alg, hash_start, hashlen,
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003526 ssl->out_msg + 6 + offset, &n,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003527 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02003528 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003529 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003530 return( ret );
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02003531 }
Paul Bakker926af752012-11-23 13:38:07 +01003532
Paul Bakker1ef83d62012-04-11 12:09:53 +00003533 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
3534 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003535
Paul Bakker1ef83d62012-04-11 12:09:53 +00003536 ssl->out_msglen = 6 + n + offset;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003537 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3538 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00003539
3540 ssl->state++;
3541
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003542 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003543 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003544 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003545 return( ret );
3546 }
3547
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003548 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003549
Paul Bakkered27a042013-04-18 22:46:23 +02003550 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003551}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003552#endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
3553 !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
Paul Bakker29f221f2016-07-22 13:49:02 +01003554 !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED &&
3555 !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
3556 !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED &&
3557 !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003558
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003559#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3560static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003561{
3562 int ret;
3563 uint32_t lifetime;
3564 size_t ticket_len;
3565 unsigned char *ticket;
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003566 const unsigned char *msg;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003567
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003568 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003569
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003570 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003571 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003572 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003573 return( ret );
3574 }
3575
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003576 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003577 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003578 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01003579 mbedtls_ssl_send_alert_message(
3580 ssl,
3581 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3582 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003583 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003584 }
3585
3586 /*
3587 * struct {
3588 * uint32 ticket_lifetime_hint;
3589 * opaque ticket<0..2^16-1>;
3590 * } NewSessionTicket;
3591 *
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003592 * 0 . 3 ticket_lifetime_hint
3593 * 4 . 5 ticket_len (n)
3594 * 6 . 5+n ticket content
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003595 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003596 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET ||
3597 ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003598 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003599 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003600 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3601 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003602 return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003603 }
3604
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003605 msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003606
Philippe Antoine84cc74e2018-05-11 11:06:29 +02003607 lifetime = ( ((uint32_t) msg[0]) << 24 ) | ( msg[1] << 16 ) |
3608 ( msg[2] << 8 ) | ( msg[3] );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003609
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003610 ticket_len = ( msg[4] << 8 ) | ( msg[5] );
3611
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003612 if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003613 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003614 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003615 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3616 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003617 return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003618 }
3619
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003620 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003621
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02003622 /* We're not waiting for a NewSessionTicket message any more */
3623 ssl->handshake->new_session_ticket = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003624 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02003625
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003626 /*
3627 * Zero-length ticket means the server changed his mind and doesn't want
3628 * to send a ticket after all, so just forget it
3629 */
Paul Bakker66d5d072014-06-17 16:39:18 +02003630 if( ticket_len == 0 )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003631 return( 0 );
3632
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003633 mbedtls_zeroize( ssl->session_negotiate->ticket,
Paul Bakker34617722014-06-13 17:20:13 +02003634 ssl->session_negotiate->ticket_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003635 mbedtls_free( ssl->session_negotiate->ticket );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003636 ssl->session_negotiate->ticket = NULL;
3637 ssl->session_negotiate->ticket_len = 0;
3638
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02003639 if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003640 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02003641 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003642 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3643 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02003644 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003645 }
3646
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003647 memcpy( ticket, msg + 6, ticket_len );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003648
3649 ssl->session_negotiate->ticket = ticket;
3650 ssl->session_negotiate->ticket_len = ticket_len;
3651 ssl->session_negotiate->ticket_lifetime = lifetime;
3652
3653 /*
3654 * RFC 5077 section 3.4:
3655 * "If the client receives a session ticket from the server, then it
3656 * discards any Session ID that was sent in the ServerHello."
3657 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003658 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02003659 ssl->session_negotiate->id_len = 0;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003660
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003661 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003662
3663 return( 0 );
3664}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003665#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003666
Paul Bakker5121ce52009-01-03 21:22:43 +00003667/*
Paul Bakker1961b702013-01-25 14:49:24 +01003668 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00003669 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003670int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003671{
3672 int ret = 0;
3673
Manuel Pégourié-Gonnarddba460f2015-06-24 22:59:30 +02003674 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003675 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003676
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003677 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
Paul Bakker1961b702013-01-25 14:49:24 +01003678
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003679 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
Paul Bakker1961b702013-01-25 14:49:24 +01003680 return( ret );
3681
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003682#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003683 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003684 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003685 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003686 if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003687 return( ret );
3688 }
3689#endif
3690
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003691 /* Change state now, so that it is right in mbedtls_ssl_read_record(), used
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003692 * by DTLS for dropping out-of-sequence ChangeCipherSpec records */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003693#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3694 if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003695 ssl->handshake->new_session_ticket != 0 )
3696 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003697 ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003698 }
3699#endif
3700
Paul Bakker1961b702013-01-25 14:49:24 +01003701 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00003702 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003703 case MBEDTLS_SSL_HELLO_REQUEST:
3704 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00003705 break;
3706
Paul Bakker1961b702013-01-25 14:49:24 +01003707 /*
3708 * ==> ClientHello
3709 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003710 case MBEDTLS_SSL_CLIENT_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01003711 ret = ssl_write_client_hello( ssl );
3712 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003713
Paul Bakker1961b702013-01-25 14:49:24 +01003714 /*
3715 * <== ServerHello
3716 * Certificate
3717 * ( ServerKeyExchange )
3718 * ( CertificateRequest )
3719 * ServerHelloDone
3720 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003721 case MBEDTLS_SSL_SERVER_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01003722 ret = ssl_parse_server_hello( ssl );
3723 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003724
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003725 case MBEDTLS_SSL_SERVER_CERTIFICATE:
3726 ret = mbedtls_ssl_parse_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003727 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003728
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003729 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01003730 ret = ssl_parse_server_key_exchange( ssl );
3731 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003732
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003733 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Paul Bakker1961b702013-01-25 14:49:24 +01003734 ret = ssl_parse_certificate_request( ssl );
3735 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003736
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003737 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Paul Bakker1961b702013-01-25 14:49:24 +01003738 ret = ssl_parse_server_hello_done( ssl );
3739 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003740
Paul Bakker1961b702013-01-25 14:49:24 +01003741 /*
3742 * ==> ( Certificate/Alert )
3743 * ClientKeyExchange
3744 * ( CertificateVerify )
3745 * ChangeCipherSpec
3746 * Finished
3747 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003748 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
3749 ret = mbedtls_ssl_write_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003750 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003751
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003752 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01003753 ret = ssl_write_client_key_exchange( ssl );
3754 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003755
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003756 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Paul Bakker1961b702013-01-25 14:49:24 +01003757 ret = ssl_write_certificate_verify( ssl );
3758 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003759
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003760 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
3761 ret = mbedtls_ssl_write_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003762 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003763
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003764 case MBEDTLS_SSL_CLIENT_FINISHED:
3765 ret = mbedtls_ssl_write_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003766 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003767
Paul Bakker1961b702013-01-25 14:49:24 +01003768 /*
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003769 * <== ( NewSessionTicket )
3770 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01003771 * Finished
3772 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003773#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3774 case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003775 ret = ssl_parse_new_session_ticket( ssl );
3776 break;
Paul Bakkera503a632013-08-14 13:48:06 +02003777#endif
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003778
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003779 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
3780 ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003781 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003782
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003783 case MBEDTLS_SSL_SERVER_FINISHED:
3784 ret = mbedtls_ssl_parse_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003785 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003786
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003787 case MBEDTLS_SSL_FLUSH_BUFFERS:
3788 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
3789 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01003790 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003791
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003792 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
3793 mbedtls_ssl_handshake_wrapup( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003794 break;
Paul Bakker48916f92012-09-16 19:57:18 +00003795
Paul Bakker1961b702013-01-25 14:49:24 +01003796 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003797 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
3798 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker1961b702013-01-25 14:49:24 +01003799 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003800
3801 return( ret );
3802}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003803#endif /* MBEDTLS_SSL_CLI_C */