blob: 8a48570784b28e680a51108ec4a5b682ce545072 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 client-side functions
3 *
Bence Szépkúti44bfbe32020-08-19 16:54:51 +02004 * Copyright The Mbed TLS Contributors
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 * **********
Paul Bakker5121ce52009-01-03 21:22:43 +000045 */
46
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020047#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000048#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020049#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020051#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000052
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#if defined(MBEDTLS_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000054
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000056#include "mbedtls/platform.h"
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020057#else
Rich Evans00ab4702015-02-06 13:43:58 +000058#include <stdlib.h>
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +020059#define mbedtls_calloc calloc
SimonBd5800b72016-04-26 07:43:27 +010060#define mbedtls_free free
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020061#endif
62
SimonBd5800b72016-04-26 07:43:27 +010063#include "mbedtls/debug.h"
64#include "mbedtls/ssl.h"
65#include "mbedtls/ssl_internal.h"
66
67#include <string.h>
68
Manuel Pégourié-Gonnard93866642015-06-22 19:21:23 +020069#include <stdint.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020070
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020071#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010072#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020073#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000074
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020075#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Paul Bakker34617722014-06-13 17:20:13 +020076/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020077static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020078 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
79}
80#endif
81
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020082#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Hanno Becker0e8dc482017-04-12 14:54:42 +010083static int ssl_write_hostname_ext( mbedtls_ssl_context *ssl,
84 unsigned char *buf,
85 const unsigned char *end,
86 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +010087{
88 unsigned char *p = buf;
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +010089 size_t hostname_len;
Paul Bakkerd3edc862013-03-20 16:07:17 +010090
91 *olen = 0;
92
Paul Bakker66d5d072014-06-17 16:39:18 +020093 if( ssl->hostname == NULL )
Hanno Becker0e8dc482017-04-12 14:54:42 +010094 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +010095
Hanno Becker8cf6b492017-05-08 11:06:19 +010096 MBEDTLS_SSL_DEBUG_MSG( 3,
97 ( "client hello, adding server name extension: %s",
98 ssl->hostname ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +010099
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100100 hostname_len = strlen( ssl->hostname );
101
Hanno Becker0e8dc482017-04-12 14:54:42 +0100102 MBEDTLS_SSL_CHK_BUF_PTR( p, end, hostname_len + 9 );
Simon Butchered997662015-09-28 02:14:30 +0100103
Paul Bakkerd3edc862013-03-20 16:07:17 +0100104 /*
Hanno Becker1a9a51c2017-04-07 13:02:16 +0100105 * Sect. 3, RFC 6066 (TLS Extensions Definitions)
106 *
107 * In order to provide any of the server names, clients MAY include an
108 * extension of type "server_name" in the (extended) client hello. The
109 * "extension_data" field of this extension SHALL contain
110 * "ServerNameList" where:
111 *
Paul Bakkerd3edc862013-03-20 16:07:17 +0100112 * struct {
113 * NameType name_type;
114 * select (name_type) {
115 * case host_name: HostName;
116 * } name;
117 * } ServerName;
118 *
119 * enum {
120 * host_name(0), (255)
121 * } NameType;
122 *
123 * opaque HostName<1..2^16-1>;
124 *
125 * struct {
126 * ServerName server_name_list<1..2^16-1>
127 * } ServerNameList;
Hanno Becker1a9a51c2017-04-07 13:02:16 +0100128 *
Paul Bakkerd3edc862013-03-20 16:07:17 +0100129 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200130 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
131 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100132
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100133 *p++ = (unsigned char)( ( (hostname_len + 5) >> 8 ) & 0xFF );
134 *p++ = (unsigned char)( ( (hostname_len + 5) ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100135
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100136 *p++ = (unsigned char)( ( (hostname_len + 3) >> 8 ) & 0xFF );
137 *p++ = (unsigned char)( ( (hostname_len + 3) ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100138
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200139 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100140 *p++ = (unsigned char)( ( hostname_len >> 8 ) & 0xFF );
141 *p++ = (unsigned char)( ( hostname_len ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100142
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100143 memcpy( p, ssl->hostname, hostname_len );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100144
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100145 *olen = hostname_len + 9;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100146
147 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100148}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200149#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100150
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151#if defined(MBEDTLS_SSL_RENEGOTIATION)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100152static int ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,
153 unsigned char *buf,
154 const unsigned char *end,
155 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100156{
157 unsigned char *p = buf;
158
159 *olen = 0;
160
Hanno Becker40f8b512017-10-12 14:58:55 +0100161 /* We're always including an TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the
162 * initial ClientHello, in which case also adding the renegotiation
163 * info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200164 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100165 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100166
Hanno Becker8cf6b492017-05-08 11:06:19 +0100167 MBEDTLS_SSL_DEBUG_MSG( 3,
168 ( "client hello, adding renegotiation extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100169
Hanno Becker0e8dc482017-04-12 14:54:42 +0100170 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 5 + ssl->verify_data_len );
Simon Butchered997662015-09-28 02:14:30 +0100171
Paul Bakkerd3edc862013-03-20 16:07:17 +0100172 /*
173 * Secure renegotiation
174 */
Hanno Becker8cf6b492017-05-08 11:06:19 +0100175 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 )
176 & 0xFF );
177 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO )
178 & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100179
180 *p++ = 0x00;
181 *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
182 *p++ = ssl->verify_data_len & 0xFF;
183
184 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
185
186 *olen = 5 + ssl->verify_data_len;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100187
188 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100189}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200190#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100191
Manuel Pégourié-Gonnardd9423232014-12-02 11:57:29 +0100192/*
193 * Only if we handle at least one key exchange that needs signatures.
194 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200195#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
196 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100197static int ssl_write_signature_algorithms_ext( mbedtls_ssl_context *ssl,
198 unsigned char *buf,
199 const unsigned char *end,
200 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100201{
202 unsigned char *p = buf;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100203 size_t sig_alg_len = 0;
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200204 const int *md;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200206#if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5bfd9682014-06-24 15:18:11 +0200207 unsigned char *sig_alg_list = buf + 6;
208#endif
Paul Bakkerd3edc862013-03-20 16:07:17 +0100209
210 *olen = 0;
211
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200212 if( ssl->conf->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100213 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100214
Hanno Becker8cf6b492017-05-08 11:06:19 +0100215 MBEDTLS_SSL_DEBUG_MSG( 3,
216 ( "client hello, adding signature_algorithms extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100217
Hanno Becker20643552017-04-12 14:54:42 +0100218 if( ssl->conf->sig_hashes == NULL )
219 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
220
Simon Butchered997662015-09-28 02:14:30 +0100221 for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
222 {
223#if defined(MBEDTLS_ECDSA_C)
224 sig_alg_len += 2;
225#endif
226#if defined(MBEDTLS_RSA_C)
227 sig_alg_len += 2;
228#endif
Hanno Becker20643552017-04-12 14:54:42 +0100229 if( sig_alg_len > MBEDTLS_SSL_MAX_SIG_HASH_ALG_LIST_LEN )
230 {
231 MBEDTLS_SSL_DEBUG_MSG( 3,
232 ( "length in bytes of sig-hash-alg extension too big" ) );
233 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
234 }
Simon Butchered997662015-09-28 02:14:30 +0100235 }
236
Hanno Becker20643552017-04-12 14:54:42 +0100237 /* Empty signature algorithms list, this is a configuration error. */
238 if( sig_alg_len == 0 )
239 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
240
Hanno Becker0e8dc482017-04-12 14:54:42 +0100241 MBEDTLS_SSL_CHK_BUF_PTR( p, end, sig_alg_len + 6 );
Simon Butchered997662015-09-28 02:14:30 +0100242
Paul Bakkerd3edc862013-03-20 16:07:17 +0100243 /*
244 * Prepare signature_algorithms extension (TLS 1.2)
245 */
Simon Butchered997662015-09-28 02:14:30 +0100246 sig_alg_len = 0;
247
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200248 for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
249 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200250#if defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200251 sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
252 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA;
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200253#endif
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200254#if defined(MBEDTLS_RSA_C)
255 sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
256 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA;
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200257#endif
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200258 }
Paul Bakkerd3edc862013-03-20 16:07:17 +0100259
260 /*
261 * enum {
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200262 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
263 * sha512(6), (255)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100264 * } HashAlgorithm;
265 *
266 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
267 * SignatureAlgorithm;
268 *
269 * struct {
270 * HashAlgorithm hash;
271 * SignatureAlgorithm signature;
272 * } SignatureAndHashAlgorithm;
273 *
274 * SignatureAndHashAlgorithm
275 * supported_signature_algorithms<2..2^16-2>;
276 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200277 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
278 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100279
280 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
281 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
282
283 *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
284 *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
285
Paul Bakkerd3edc862013-03-20 16:07:17 +0100286 *olen = 6 + sig_alg_len;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100287
288 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100289}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200290#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
291 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100292
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +0200293#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100294 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100295static int ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,
296 unsigned char *buf,
297 const unsigned char *end,
298 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100299{
300 unsigned char *p = buf;
Manuel Pégourié-Gonnard8e205fc2014-01-23 17:27:10 +0100301 unsigned char *elliptic_curve_list = p + 6;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100302 size_t elliptic_curve_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200303 const mbedtls_ecp_curve_info *info;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200304 const mbedtls_ecp_group_id *grp_id;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100305
306 *olen = 0;
307
Hanno Becker8cf6b492017-05-08 11:06:19 +0100308 MBEDTLS_SSL_DEBUG_MSG( 3,
309 ( "client hello, adding supported_elliptic_curves extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100310
Hanno Becker20643552017-04-12 14:54:42 +0100311 if( ssl->conf->curve_list == NULL )
312 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
313
Hanno Becker8cf6b492017-05-08 11:06:19 +0100314 for( grp_id = ssl->conf->curve_list;
315 *grp_id != MBEDTLS_ECP_DP_NONE;
316 grp_id++ )
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100317 {
Gilles Peskinef9828522017-05-03 12:28:43 +0200318 info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
Janos Follath8a317052016-04-21 23:37:09 +0100319 if( info == NULL )
320 {
Hanno Becker8cf6b492017-05-08 11:06:19 +0100321 MBEDTLS_SSL_DEBUG_MSG( 1,
322 ( "invalid curve in ssl configuration" ) );
Hanno Becker20643552017-04-12 14:54:42 +0100323 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
Janos Follath8a317052016-04-21 23:37:09 +0100324 }
Simon Butchered997662015-09-28 02:14:30 +0100325 elliptic_curve_len += 2;
Hanno Becker20643552017-04-12 14:54:42 +0100326
327 if( elliptic_curve_len > MBEDTLS_SSL_MAX_CURVE_LIST_LEN )
328 {
329 MBEDTLS_SSL_DEBUG_MSG( 3,
330 ( "malformed supported_elliptic_curves extension in config" ) );
331 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
332 }
Simon Butchered997662015-09-28 02:14:30 +0100333 }
334
Hanno Becker20643552017-04-12 14:54:42 +0100335 /* Empty elliptic curve list, this is a configuration error. */
Hanno Becker0e8dc482017-04-12 14:54:42 +0100336 if( elliptic_curve_len == 0 )
Hanno Becker20643552017-04-12 14:54:42 +0100337 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
Hanno Becker0e8dc482017-04-12 14:54:42 +0100338
339 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 + elliptic_curve_len );
Simon Butchered997662015-09-28 02:14:30 +0100340
341 elliptic_curve_len = 0;
342
Hanno Becker8cf6b492017-05-08 11:06:19 +0100343 for( grp_id = ssl->conf->curve_list;
344 *grp_id != MBEDTLS_ECP_DP_NONE;
345 grp_id++ )
Simon Butchered997662015-09-28 02:14:30 +0100346 {
Gilles Peskinef9828522017-05-03 12:28:43 +0200347 info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100348 elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8;
349 elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF;
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200350 }
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200351
Hanno Becker8cf6b492017-05-08 11:06:19 +0100352 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 )
353 & 0xFF );
354 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES )
355 & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100356
357 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
358 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
359
360 *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
361 *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
362
Paul Bakkerd3edc862013-03-20 16:07:17 +0100363 *olen = 6 + elliptic_curve_len;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100364
365 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100366}
367
Hanno Becker0e8dc482017-04-12 14:54:42 +0100368static int ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
369 unsigned char *buf,
370 const unsigned char *end,
371 size_t *olen )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100372{
373 unsigned char *p = buf;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100374 (void) ssl; /* ssl used for debugging only */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100375
376 *olen = 0;
377
Hanno Becker8cf6b492017-05-08 11:06:19 +0100378 MBEDTLS_SSL_DEBUG_MSG( 3,
379 ( "client hello, adding supported_point_formats extension" ) );
Hanno Becker0e8dc482017-04-12 14:54:42 +0100380 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
Simon Butchered997662015-09-28 02:14:30 +0100381
Hanno Becker8cf6b492017-05-08 11:06:19 +0100382 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 )
383 & 0xFF );
384 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS )
385 & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100386
387 *p++ = 0x00;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100388 *p++ = 2;
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200389
390 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200391 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100392
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200393 *olen = 6;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100394
395 return( 0 );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100396}
Simon Butcherbb5e1c32018-06-08 11:14:43 +0100397#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
Robert Cragieae8535d2015-10-06 17:11:18 +0100398 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100399
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200400#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100401static int ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
402 unsigned char *buf,
403 const unsigned char *end,
404 size_t *olen )
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200405{
406 int ret;
407 unsigned char *p = buf;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200408 size_t kkpp_len;
409
410 *olen = 0;
411
412 /* Skip costly extension if we can't use EC J-PAKE anyway */
413 if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100414 return( 0 );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200415
Hanno Becker8cf6b492017-05-08 11:06:19 +0100416 MBEDTLS_SSL_DEBUG_MSG( 3,
417 ( "client hello, adding ecjpake_kkpp extension" ) );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200418
Hanno Becker0e8dc482017-04-12 14:54:42 +0100419 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200420
421 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
422 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
423
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200424 /*
425 * We may need to send ClientHello multiple times for Hello verification.
426 * We don't want to compute fresh values every time (both for performance
427 * and consistency reasons), so cache the extension content.
428 */
429 if( ssl->handshake->ecjpake_cache == NULL ||
430 ssl->handshake->ecjpake_cache_len == 0 )
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200431 {
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200432 MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) );
433
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +0200434 ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
Hanno Becker0e8dc482017-04-12 14:54:42 +0100435 p + 2, end - p - 2, &kkpp_len,
436 ssl->conf->f_rng, ssl->conf->p_rng );
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +0200437 if( ret != 0 )
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200438 {
Hanno Becker8cf6b492017-05-08 11:06:19 +0100439 MBEDTLS_SSL_DEBUG_RET( 1 ,
440 "mbedtls_ecjpake_write_round_one", ret );
Hanno Becker0e8dc482017-04-12 14:54:42 +0100441 return( ret );
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200442 }
443
444 ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len );
445 if( ssl->handshake->ecjpake_cache == NULL )
446 {
447 MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) );
Hanno Becker0e8dc482017-04-12 14:54:42 +0100448 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200449 }
450
451 memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len );
452 ssl->handshake->ecjpake_cache_len = kkpp_len;
453 }
454 else
455 {
456 MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) );
457
458 kkpp_len = ssl->handshake->ecjpake_cache_len;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100459 MBEDTLS_SSL_CHK_BUF_PTR( p + 2, end, kkpp_len );
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200460
461 memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200462 }
463
464 *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
465 *p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
466
467 *olen = kkpp_len + 4;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100468
469 return( 0 );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200470}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200471#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000472
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200473#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100474static int ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
475 unsigned char *buf,
476 const unsigned char *end,
477 size_t *olen )
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200478{
479 unsigned char *p = buf;
480
Simon Butcher0fc94e92015-09-28 20:52:04 +0100481 *olen = 0;
482
Hanno Becker0e8dc482017-04-12 14:54:42 +0100483 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE )
484 return( 0 );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200485
Hanno Becker8cf6b492017-05-08 11:06:19 +0100486 MBEDTLS_SSL_DEBUG_MSG( 3,
487 ( "client hello, adding max_fragment_length extension" ) );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200488
Hanno Becker0e8dc482017-04-12 14:54:42 +0100489 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 5 );
Simon Butchered997662015-09-28 02:14:30 +0100490
Hanno Becker8cf6b492017-05-08 11:06:19 +0100491 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 )
492 & 0xFF );
493 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH )
494 & 0xFF );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200495
496 *p++ = 0x00;
497 *p++ = 1;
498
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200499 *p++ = ssl->conf->mfl_code;
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200500
501 *olen = 5;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100502
503 return( 0 );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200504}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200505#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200506
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200507#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100508static int ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
509 unsigned char *buf,
510 const unsigned char *end,
511 size_t *olen )
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200512{
513 unsigned char *p = buf;
514
Simon Butcher0fc94e92015-09-28 20:52:04 +0100515 *olen = 0;
516
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200517 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100518 return( 0 );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200519
Hanno Becker8cf6b492017-05-08 11:06:19 +0100520 MBEDTLS_SSL_DEBUG_MSG( 3,
521 ( "client hello, adding truncated_hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200522
Hanno Becker0e8dc482017-04-12 14:54:42 +0100523 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Simon Butchered997662015-09-28 02:14:30 +0100524
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200525 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
526 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200527
528 *p++ = 0x00;
529 *p++ = 0x00;
530
531 *olen = 4;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100532
533 return( 0 );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200534}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200535#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200536
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200537#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100538static int ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
539 unsigned char *buf,
540 const unsigned char *end,
541 size_t *olen )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100542{
543 unsigned char *p = buf;
544
Simon Butcher0fc94e92015-09-28 20:52:04 +0100545 *olen = 0;
546
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200547 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
548 ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100549 return( 0 );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100550
Hanno Becker8cf6b492017-05-08 11:06:19 +0100551 MBEDTLS_SSL_DEBUG_MSG( 3,
552 ( "client hello, adding encrypt_then_mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100553
Hanno Becker0e8dc482017-04-12 14:54:42 +0100554 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Simon Butchered997662015-09-28 02:14:30 +0100555
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200556 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
557 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100558
559 *p++ = 0x00;
560 *p++ = 0x00;
561
562 *olen = 4;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100563
564 return( 0 );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100565}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200566#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100567
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200568#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100569static int ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,
570 unsigned char *buf,
571 const unsigned char *end,
572 size_t *olen )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200573{
574 unsigned char *p = buf;
575
Simon Butcher0fc94e92015-09-28 20:52:04 +0100576 *olen = 0;
577
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200578 if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
579 ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100580 return( 0 );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200581
Hanno Becker8cf6b492017-05-08 11:06:19 +0100582 MBEDTLS_SSL_DEBUG_MSG( 3,
583 ( "client hello, adding extended_master_secret extension" ) );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200584
Hanno Becker0e8dc482017-04-12 14:54:42 +0100585 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Simon Butchered997662015-09-28 02:14:30 +0100586
Hanno Becker8cf6b492017-05-08 11:06:19 +0100587 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 )
588 & 0xFF );
589 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET )
590 & 0xFF );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200591
592 *p++ = 0x00;
593 *p++ = 0x00;
594
595 *olen = 4;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100596
597 return( 0 );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200598}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200599#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200600
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200601#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100602static int ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,
603 unsigned char *buf,
604 const unsigned char *end,
605 size_t *olen )
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200606{
607 unsigned char *p = buf;
608 size_t tlen = ssl->session_negotiate->ticket_len;
609
Simon Butcher0fc94e92015-09-28 20:52:04 +0100610 *olen = 0;
611
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200612 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100613 return( 0 );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200614
Hanno Becker8cf6b492017-05-08 11:06:19 +0100615 MBEDTLS_SSL_DEBUG_MSG( 3,
616 ( "client hello, adding session ticket extension" ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200617
Hanno Becker0e8dc482017-04-12 14:54:42 +0100618 /* The addition is safe here since the ticket length is 16 bit. */
619 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 + tlen );
Simon Butchered997662015-09-28 02:14:30 +0100620
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200621 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
622 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200623
624 *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
625 *p++ = (unsigned char)( ( tlen ) & 0xFF );
626
627 *olen = 4;
628
Simon Butchered997662015-09-28 02:14:30 +0100629 if( ssl->session_negotiate->ticket == NULL || tlen == 0 )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100630 return( 0 );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200631
Hanno Becker8cf6b492017-05-08 11:06:19 +0100632 MBEDTLS_SSL_DEBUG_MSG( 3,
633 ( "sending session ticket of length %d", tlen ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200634
635 memcpy( p, ssl->session_negotiate->ticket, tlen );
636
637 *olen += tlen;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100638
639 return( 0 );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200640}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200641#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200642
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200643#if defined(MBEDTLS_SSL_ALPN)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100644static int ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
645 unsigned char *buf,
646 const unsigned char *end,
647 size_t *olen )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200648{
649 unsigned char *p = buf;
Simon Butchered997662015-09-28 02:14:30 +0100650 size_t alpnlen = 0;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200651 const char **cur;
652
Simon Butcher0fc94e92015-09-28 20:52:04 +0100653 *olen = 0;
654
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200655 if( ssl->conf->alpn_list == NULL )
Hanno Becker0e8dc482017-04-12 14:54:42 +0100656 return( 0 );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200657
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200658 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200659
Simon Butchered997662015-09-28 02:14:30 +0100660 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
Hanno Becker20643552017-04-12 14:54:42 +0100661 alpnlen += strlen( *cur ) + 1;
Simon Butchered997662015-09-28 02:14:30 +0100662
Hanno Becker0e8dc482017-04-12 14:54:42 +0100663 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 + alpnlen );
Simon Butchered997662015-09-28 02:14:30 +0100664
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200665 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );
666 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200667
668 /*
669 * opaque ProtocolName<1..2^8-1>;
670 *
671 * struct {
672 * ProtocolName protocol_name_list<2..2^16-1>
673 * } ProtocolNameList;
674 */
675
676 /* Skip writing extension and list length for now */
677 p += 4;
678
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200679 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200680 {
Hanno Becker20643552017-04-12 14:54:42 +0100681 /*
682 * mbedtls_ssl_conf_set_alpn_protocols() checked that the length of
683 * protocol names is less than 255.
684 */
685 *p = (unsigned char)strlen( *cur );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200686 memcpy( p + 1, *cur, *p );
687 p += 1 + *p;
688 }
689
690 *olen = p - buf;
691
692 /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
693 buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
694 buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF );
695
696 /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */
697 buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
698 buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF );
Hanno Becker0e8dc482017-04-12 14:54:42 +0100699
700 return( 0 );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200701}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200702#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200703
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200704/*
705 * Generate random bytes for ClientHello
706 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200707static int ssl_generate_random( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200708{
709 int ret;
710 unsigned char *p = ssl->handshake->randbytes;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200711#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +0100712 mbedtls_time_t t;
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200713#endif
714
Manuel Pégourié-Gonnardfb2d2232014-07-22 15:59:14 +0200715 /*
716 * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1)
717 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200718#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200719 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnardfb2d2232014-07-22 15:59:14 +0200720 ssl->handshake->verify_cookie != NULL )
721 {
722 return( 0 );
723 }
724#endif
725
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200726#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +0100727 t = mbedtls_time( NULL );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200728 *p++ = (unsigned char)( t >> 24 );
729 *p++ = (unsigned char)( t >> 16 );
730 *p++ = (unsigned char)( t >> 8 );
731 *p++ = (unsigned char)( t );
732
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200733 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200734#else
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +0100735 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200736 return( ret );
737
738 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200739#endif /* MBEDTLS_HAVE_TIME */
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200740
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +0100741 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200742 return( ret );
743
744 return( 0 );
745}
746
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +0100747/**
748 * \brief Validate cipher suite against config in SSL context.
749 *
750 * \param suite_info cipher suite to validate
751 * \param ssl SSL context
Andrzej Kurek66080962018-04-25 05:06:07 -0400752 * \param min_minor_ver Minimal minor version to accept a cipher suite
753 * \param max_minor_ver Maximal minor version to accept a cipher suite
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +0100754 *
755 * \return 0 if valid, else 1
756 */
Hanno Becker8cf6b492017-05-08 11:06:19 +0100757static int ssl_validate_ciphersuite(
758 const mbedtls_ssl_ciphersuite_t * suite_info,
759 const mbedtls_ssl_context * ssl,
760 int min_minor_ver, int max_minor_ver )
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +0100761{
Andrzej Kurek66080962018-04-25 05:06:07 -0400762 (void) ssl;
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +0100763 if( suite_info == NULL )
764 return( 1 );
765
Andrzej Kurek66080962018-04-25 05:06:07 -0400766 if( suite_info->min_minor_ver > max_minor_ver ||
767 suite_info->max_minor_ver < min_minor_ver )
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +0100768 return( 1 );
769
770#if defined(MBEDTLS_SSL_PROTO_DTLS)
771 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
772 ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )
773 return( 1 );
774#endif
775
776#if defined(MBEDTLS_ARC4_C)
777 if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&
778 suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
779 return( 1 );
780#endif
781
782#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
783 if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
784 mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
785 return( 1 );
786#endif
787
788 return( 0 );
789}
790
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200791static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +0000792{
Paul Bakker23986e52011-04-24 08:57:21 +0000793 int ret;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100794 size_t i, n, olen, ext_len = 0;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100795
Paul Bakker5121ce52009-01-03 21:22:43 +0000796 unsigned char *buf;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200797 unsigned char *p, *q;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100798 const unsigned char *end;
799
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +0200800 unsigned char offer_compress;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200801 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200802 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Ron Eldorc32b3b72018-02-14 19:30:48 +0200803#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
804 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
805 int uses_ec = 0;
806#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000807
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200808 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000809
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +0100810 if( ssl->conf->f_rng == NULL )
Paul Bakkera9a028e2013-11-21 17:31:06 +0100811 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200812 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
813 return( MBEDTLS_ERR_SSL_NO_RNG );
Paul Bakkera9a028e2013-11-21 17:31:06 +0100814 }
815
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200816#if defined(MBEDTLS_SSL_RENEGOTIATION)
817 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100818#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000819 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200820 ssl->major_ver = ssl->conf->min_major_ver;
821 ssl->minor_ver = ssl->conf->min_minor_ver;
Paul Bakker48916f92012-09-16 19:57:18 +0000822 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000823
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +0200824 if( ssl->conf->max_major_ver == 0 )
Paul Bakker490ecc82011-10-06 13:04:09 +0000825 {
Hanno Becker8cf6b492017-05-08 11:06:19 +0100826 MBEDTLS_SSL_DEBUG_MSG( 1,
827 ( "configured max major version is invalid, consider using mbedtls_ssl_config_defaults()" ) );
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +0200828 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker490ecc82011-10-06 13:04:09 +0000829 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000830
Hanno Becker0e8dc482017-04-12 14:54:42 +0100831 buf = ssl->out_msg;
832 end = buf + MBEDTLS_SSL_MAX_CONTENT_LEN;
833
Paul Bakker5121ce52009-01-03 21:22:43 +0000834 /*
Hanno Becker0e8dc482017-04-12 14:54:42 +0100835 * Check if there's enough space for the first part of the ClientHello
836 * consisting of the 38 bytes described below, the session identifier (at
837 * most 32 bytes) and its length (1 byte).
838 *
839 * Use static upper bounds instead of the actual values
840 * to allow the compiler to optimize this away.
841 */
842 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 38 + 1 + 32 );
843
844 /*
845 * The 38 first bytes of the ClientHello:
846 * 0 . 0 handshake type (written later)
847 * 1 . 3 handshake length (written later)
Paul Bakker5121ce52009-01-03 21:22:43 +0000848 * 4 . 5 highest version supported
849 * 6 . 9 current UNIX time
850 * 10 . 37 random bytes
Hanno Becker0e8dc482017-04-12 14:54:42 +0100851 *
852 * The current UNIX time (4 bytes) and following 28 random bytes are written
853 * by ssl_generate_random() into ssl->handshake->randbytes buffer and then
854 * copied from there into the output buffer.
Paul Bakker5121ce52009-01-03 21:22:43 +0000855 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000856
Hanno Becker0e8dc482017-04-12 14:54:42 +0100857 p = buf + 4;
Hanno Becker8cf6b492017-05-08 11:06:19 +0100858 mbedtls_ssl_write_version( ssl->conf->max_major_ver,
859 ssl->conf->max_minor_ver,
860 ssl->conf->transport, p );
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100861 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000862
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200863 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
Paul Bakker5121ce52009-01-03 21:22:43 +0000864 buf[4], buf[5] ) );
865
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200866 if( ( ret = ssl_generate_random( ssl ) ) != 0 )
867 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200868 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200869 return( ret );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200870 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200871
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200872 memcpy( p, ssl->handshake->randbytes, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200873 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", p, 32 );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200874 p += 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000875
876 /*
877 * 38 . 38 session id length
878 * 39 . 39+n session id
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100879 * 39+n . 39+n DTLS only: cookie length (1 byte)
Hanno Becker0e8dc482017-04-12 14:54:42 +0100880 * 40+n . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100881 * .. . .. ciphersuitelist length (2 bytes)
882 * .. . .. ciphersuitelist
883 * .. . .. compression methods length (1 byte)
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000884 * .. . .. compression methods
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100885 * .. . .. extensions length (2 bytes)
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000886 * .. . .. extensions
Paul Bakker5121ce52009-01-03 21:22:43 +0000887 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200888 n = ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +0000889
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100890 if( n < 16 || n > 32 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200891#if defined(MBEDTLS_SSL_RENEGOTIATION)
892 ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100893#endif
Paul Bakker0a597072012-09-25 21:55:46 +0000894 ssl->handshake->resume == 0 )
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200895 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000896 n = 0;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200897 }
898
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200899#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200900 /*
901 * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
902 * generate and include a Session ID in the TLS ClientHello."
903 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200904#if defined(MBEDTLS_SSL_RENEGOTIATION)
905 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000906#endif
Manuel Pégourié-Gonnardd2b35ec2015-03-10 11:40:43 +0000907 {
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000908 if( ssl->session_negotiate->ticket != NULL &&
909 ssl->session_negotiate->ticket_len != 0 )
910 {
Hanno Becker8cf6b492017-05-08 11:06:19 +0100911 ret = ssl->conf->f_rng( ssl->conf->p_rng,
912 ssl->session_negotiate->id, 32 );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200913
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000914 if( ret != 0 )
915 return( ret );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200916
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200917 ssl->session_negotiate->id_len = n = 32;
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000918 }
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200919 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200920#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Paul Bakker5121ce52009-01-03 21:22:43 +0000921
Hanno Becker0e8dc482017-04-12 14:54:42 +0100922 /*
923 * The first check of the output buffer size above (
924 * MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 38 + 1 + 32 );)
925 * has checked that there is enough space in the output buffer for the
926 * session identifier length byte and the session identifier (n <= 32).
927 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000928 *p++ = (unsigned char) n;
929
930 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +0000931 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000932
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200933 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
934 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000935
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100936 /*
Hanno Becker0e8dc482017-04-12 14:54:42 +0100937 * With 'n' being the length of the session identifier
938 *
939 * 39+n . 39+n DTLS only: cookie length (1 byte)
940 * 40+n . .. DTLS only: cookie
941 * .. . .. ciphersuitelist length (2 bytes)
942 * .. . .. ciphersuitelist
943 * .. . .. compression methods length (1 byte)
944 * .. . .. compression methods
945 * .. . .. extensions length (2 bytes)
946 * .. . .. extensions
947 */
948
949 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100950 * DTLS cookie
951 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200952#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200953 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100954 {
Hanno Becker0e8dc482017-04-12 14:54:42 +0100955 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 1 );
956
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200957 if( ssl->handshake->verify_cookie == NULL )
958 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200959 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no verify cookie to send" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200960 *p++ = 0;
961 }
962 else
963 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200964 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200965 ssl->handshake->verify_cookie,
966 ssl->handshake->verify_cookie_len );
967
968 *p++ = ssl->handshake->verify_cookie_len;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100969
970 MBEDTLS_SSL_CHK_BUF_PTR( p, end,
971 ssl->handshake->verify_cookie_len );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200972 memcpy( p, ssl->handshake->verify_cookie,
973 ssl->handshake->verify_cookie_len );
974 p += ssl->handshake->verify_cookie_len;
975 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100976 }
977#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000978
Paul Bakker48916f92012-09-16 19:57:18 +0000979 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100980 * Ciphersuite list
Paul Bakker48916f92012-09-16 19:57:18 +0000981 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200982 ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100983
984 /* Skip writing ciphersuite length for now */
985 n = 0;
986 q = p;
Hanno Becker0e8dc482017-04-12 14:54:42 +0100987
988 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100989 p += 2;
990
Paul Bakker2fbefde2013-06-29 16:01:15 +0200991 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000992 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200993 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuites[i] );
Paul Bakker2fbefde2013-06-29 16:01:15 +0200994
Andrzej Kurek66080962018-04-25 05:06:07 -0400995 if( ssl_validate_ciphersuite( ciphersuite_info, ssl,
996 ssl->conf->min_minor_ver,
997 ssl->conf->max_minor_ver ) != 0 )
Paul Bakker2fbefde2013-06-29 16:01:15 +0200998 continue;
999
Manuel Pégourié-Gonnard60884a12015-09-16 11:13:41 +02001000 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x",
1001 ciphersuites[i] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001002
Ron Eldorc32b3b72018-02-14 19:30:48 +02001003#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
1004 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1005 uses_ec |= mbedtls_ssl_ciphersuite_uses_ec( ciphersuite_info );
1006#endif
1007
Hanno Becker0e8dc482017-04-12 14:54:42 +01001008 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
1009
Paul Bakker2fbefde2013-06-29 16:01:15 +02001010 n++;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001011 *p++ = (unsigned char)( ciphersuites[i] >> 8 );
1012 *p++ = (unsigned char)( ciphersuites[i] );
Paul Bakker5121ce52009-01-03 21:22:43 +00001013 }
1014
Hanno Becker8cf6b492017-05-08 11:06:19 +01001015 MBEDTLS_SSL_DEBUG_MSG( 3,
1016 ( "client hello, got %d ciphersuites (excluding SCSVs)", n ) );
Ron Eldor714785d2017-08-28 13:55:55 +03001017
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001018 /*
1019 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1020 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001021#if defined(MBEDTLS_SSL_RENEGOTIATION)
1022 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001023#endif
1024 {
Ron Eldor4a2fb4c2017-09-10 17:03:50 +03001025 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding EMPTY_RENEGOTIATION_INFO_SCSV" ) );
Hanno Becker0e8dc482017-04-12 14:54:42 +01001026 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001027 *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
1028 *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO );
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001029 n++;
1030 }
1031
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001032 /* Some versions of OpenSSL don't handle it correctly if not at end */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001033#if defined(MBEDTLS_SSL_FALLBACK_SCSV)
Manuel Pégourié-Gonnard684b0592015-05-06 09:27:31 +01001034 if( ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK )
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001035 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001036 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding FALLBACK_SCSV" ) );
Hanno Becker0e8dc482017-04-12 14:54:42 +01001037
1038 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001039 *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 );
1040 *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE );
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001041 n++;
1042 }
1043#endif
1044
Paul Bakker2fbefde2013-06-29 16:01:15 +02001045 *q++ = (unsigned char)( n >> 7 );
1046 *q++ = (unsigned char)( n << 1 );
1047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001048#if defined(MBEDTLS_ZLIB_SUPPORT)
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001049 offer_compress = 1;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001050#else
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001051 offer_compress = 0;
1052#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001053
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001054 /*
Johannes H4e5d23f2018-01-06 09:46:57 +01001055 * We don't support compression with DTLS right now: if many records come
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001056 * in the same datagram, uncompressing one could overwrite the next one.
1057 * We don't want to add complexity for handling that case unless there is
1058 * an actual need for it.
1059 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001060#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001061 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001062 offer_compress = 0;
1063#endif
1064
1065 if( offer_compress )
1066 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001067 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
1068 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
Hanno Becker8cf6b492017-05-08 11:06:19 +01001069 MBEDTLS_SSL_COMPRESS_DEFLATE,
1070 MBEDTLS_SSL_COMPRESS_NULL ) );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001071
Hanno Becker0e8dc482017-04-12 14:54:42 +01001072 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 3 );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001073 *p++ = 2;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001074 *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE;
1075 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001076 }
1077 else
1078 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001079 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
1080 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d",
1081 MBEDTLS_SSL_COMPRESS_NULL ) );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001082
Hanno Becker0e8dc482017-04-12 14:54:42 +01001083 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001084 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001085 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001086 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001087
Hanno Becker0e8dc482017-04-12 14:54:42 +01001088 /* First write extensions, then the total length */
1089
1090 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
1091
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001092#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001093 if( ( ret = ssl_write_hostname_ext( ssl, p + 2 + ext_len,
1094 end, &olen ) ) != 0 )
1095 {
1096 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_hostname_ext", ret );
1097 return( ret );
1098 }
Paul Bakkerd3edc862013-03-20 16:07:17 +01001099 ext_len += olen;
Paul Bakker0be444a2013-08-27 21:55:01 +02001100#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001101
Hanno Becker40f8b512017-10-12 14:58:55 +01001102 /* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added
1103 * even if MBEDTLS_SSL_RENEGOTIATION is not defined. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001104#if defined(MBEDTLS_SSL_RENEGOTIATION)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001105 if( ( ret = ssl_write_renegotiation_ext( ssl, p + 2 + ext_len,
1106 end, &olen ) ) != 0 )
1107 {
1108 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_renegotiation_ext", ret );
1109 return( ret );
1110 }
Paul Bakkerd3edc862013-03-20 16:07:17 +01001111 ext_len += olen;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001112#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001114#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1115 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001116 if( ( ret = ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len,
1117 end, &olen ) ) != 0 )
1118 {
1119 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_signature_algorithms_ext", ret );
1120 return( ret );
1121 }
Paul Bakkerd3edc862013-03-20 16:07:17 +01001122 ext_len += olen;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001123#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001124
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +02001125#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01001126 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Ron Eldorc32b3b72018-02-14 19:30:48 +02001127 if( uses_ec )
1128 {
Hanno Becker0e8dc482017-04-12 14:54:42 +01001129 if( ( ret = ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len,
1130 end, &olen ) ) != 0 )
1131 {
1132 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_supported_elliptic_curves_ext", ret );
1133 return( ret );
1134 }
Ron Eldorc32b3b72018-02-14 19:30:48 +02001135 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +01001136
Hanno Becker0e8dc482017-04-12 14:54:42 +01001137 if( ( ret = ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len,
1138 end, &olen ) ) != 0 )
1139 {
1140 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_supported_point_formats_ext", ret );
1141 return( ret );
1142 }
Ron Eldorc32b3b72018-02-14 19:30:48 +02001143 ext_len += olen;
1144 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001145#endif
1146
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02001147#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001148 if( ( ret = ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len,
1149 end, &olen ) ) != 0 )
1150 {
1151 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_ecjpake_kkpp_ext", ret );
1152 return( ret );
1153 }
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +02001154 ext_len += olen;
1155#endif
1156
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001157#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001158 if( ( ret = ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len,
1159 end, &olen ) ) != 0 )
1160 {
1161 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_max_fragment_length_ext", ret );
1162 return( ret );
1163 }
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001164 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02001165#endif
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001166
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001167#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001168 if( ( ret = ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len,
1169 end, &olen ) ) != 0 )
1170 {
1171 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_truncated_hmac_ext", ret );
1172 return( ret );
1173 }
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001174 ext_len += olen;
Paul Bakker1f2bc622013-08-15 13:45:55 +02001175#endif
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001176
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001177#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001178 if( ( ret = ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len,
1179 end, &olen ) ) != 0 )
1180 {
1181 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_encrypt_then_mac_ext", ret );
1182 return( ret );
1183 }
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001184 ext_len += olen;
1185#endif
1186
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001187#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001188 if( ( ret = ssl_write_extended_ms_ext( ssl, p + 2 + ext_len,
1189 end, &olen ) ) != 0 )
1190 {
1191 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_extended_ms_ext", ret );
1192 return( ret );
1193 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001194 ext_len += olen;
1195#endif
1196
Simon Butcher5624ec82015-09-29 01:06:06 +01001197#if defined(MBEDTLS_SSL_ALPN)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001198 if( ( ret = ssl_write_alpn_ext( ssl, p + 2 + ext_len,
1199 end, &olen ) ) != 0 )
1200 {
1201 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_alpn_ext", ret );
1202 return( ret );
1203 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001204 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02001205#endif
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001206
Simon Butcher5624ec82015-09-29 01:06:06 +01001207#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Hanno Becker0e8dc482017-04-12 14:54:42 +01001208 if( ( ret = ssl_write_session_ticket_ext( ssl, p + 2 + ext_len,
1209 end, &olen ) ) != 0 )
1210 {
1211 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_session_ticket_ext", ret );
1212 return( ret );
1213 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001214 ext_len += olen;
1215#endif
1216
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001217 /* olen unused if all extensions are disabled */
1218 ((void) olen);
1219
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001220 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
Hanno Becker0e8dc482017-04-12 14:54:42 +01001221 ext_len ) );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001222
Paul Bakkera7036632014-04-30 10:15:38 +02001223 if( ext_len > 0 )
1224 {
Hanno Becker0e8dc482017-04-12 14:54:42 +01001225 /* No need to check for space here, because the extension
1226 * writing functions already took care of that. */
Paul Bakkera7036632014-04-30 10:15:38 +02001227 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
1228 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
1229 p += ext_len;
1230 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001231
Paul Bakker5121ce52009-01-03 21:22:43 +00001232 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001233 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
1234 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00001235
1236 ssl->state++;
1237
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001238#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001239 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001240 mbedtls_ssl_send_flight_completed( ssl );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02001241#endif
1242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001243 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001244 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001245 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001246 return( ret );
1247 }
1248
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001249 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001250
1251 return( 0 );
1252}
1253
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001254static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001255 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +00001256 size_t len )
1257{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001258#if defined(MBEDTLS_SSL_RENEGOTIATION)
1259 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00001260 {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001261 /* Check verify-data in constant-time. The length OTOH is no secret */
Paul Bakker48916f92012-09-16 19:57:18 +00001262 if( len != 1 + ssl->verify_data_len * 2 ||
1263 buf[0] != ssl->verify_data_len * 2 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001264 mbedtls_ssl_safer_memcmp( buf + 1,
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001265 ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001266 mbedtls_ssl_safer_memcmp( buf + 1 + ssl->verify_data_len,
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001267 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001268 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001269 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001270 mbedtls_ssl_send_alert_message(
1271 ssl,
1272 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1273 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001274 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001275 }
1276 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001277 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001278#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001279 {
1280 if( len != 1 || buf[0] != 0x00 )
1281 {
Ronald Cron904775d2020-06-11 09:34:06 +02001282 MBEDTLS_SSL_DEBUG_MSG( 1,
1283 ( "non-zero length renegotiation info" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001284 mbedtls_ssl_send_alert_message(
1285 ssl,
1286 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1287 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001288 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001289 }
1290
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001291 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001292 }
Paul Bakker48916f92012-09-16 19:57:18 +00001293
1294 return( 0 );
1295}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001296
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001297#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1298static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001299 const unsigned char *buf,
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001300 size_t len )
1301{
1302 /*
1303 * server should use the extension only if we did,
1304 * and if so the server's value should match ours (and len is always 1)
1305 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001306 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ||
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001307 len != 1 ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001308 buf[0] != ssl->conf->mfl_code )
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001309 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001310 MBEDTLS_SSL_DEBUG_MSG( 1,
1311 ( "non-matching max fragment length extension" ) );
1312 mbedtls_ssl_send_alert_message(
1313 ssl,
1314 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1315 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001316 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001317 }
1318
1319 return( 0 );
1320}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001321#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Paul Bakker48916f92012-09-16 19:57:18 +00001322
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001323#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1324static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001325 const unsigned char *buf,
1326 size_t len )
1327{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001328 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ||
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001329 len != 0 )
1330 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001331 MBEDTLS_SSL_DEBUG_MSG( 1,
1332 ( "non-matching truncated HMAC extension" ) );
1333 mbedtls_ssl_send_alert_message(
1334 ssl,
1335 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1336 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001337 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001338 }
1339
1340 ((void) buf);
1341
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001342 ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001343
1344 return( 0 );
1345}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001346#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001347
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001348#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1349static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001350 const unsigned char *buf,
1351 size_t len )
1352{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001353 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001354 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001355 len != 0 )
1356 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001357 MBEDTLS_SSL_DEBUG_MSG( 1,
1358 ( "non-matching encrypt-then-MAC extension" ) );
1359 mbedtls_ssl_send_alert_message(
1360 ssl,
1361 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1362 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001363 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001364 }
1365
1366 ((void) buf);
1367
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001368 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001369
1370 return( 0 );
1371}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001372#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001373
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001374#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1375static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001376 const unsigned char *buf,
1377 size_t len )
1378{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001379 if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001380 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001381 len != 0 )
1382 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001383 MBEDTLS_SSL_DEBUG_MSG( 1,
1384 ( "non-matching extended master secret extension" ) );
1385 mbedtls_ssl_send_alert_message(
1386 ssl,
1387 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1388 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001389 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001390 }
1391
1392 ((void) buf);
1393
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001394 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001395
1396 return( 0 );
1397}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001398#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001399
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001400#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1401static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001402 const unsigned char *buf,
1403 size_t len )
1404{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001405 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ||
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02001406 len != 0 )
1407 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001408 MBEDTLS_SSL_DEBUG_MSG( 1,
1409 ( "non-matching session ticket extension" ) );
1410 mbedtls_ssl_send_alert_message(
1411 ssl,
1412 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1413 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001414 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02001415 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001416
1417 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02001418
1419 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001420
1421 return( 0 );
1422}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001423#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001424
Robert Cragie136884c2015-10-02 13:34:31 +01001425#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01001426 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001427static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001428 const unsigned char *buf,
1429 size_t len )
1430{
1431 size_t list_size;
1432 const unsigned char *p;
1433
Philippe Antoine33e5c322018-07-09 10:39:02 +02001434 if( len == 0 || (size_t)( buf[0] + 1 ) != len )
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001435 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001436 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001437 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1438 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001439 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001440 }
Philippe Antoine33e5c322018-07-09 10:39:02 +02001441 list_size = buf[0];
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001442
Manuel Pégourié-Gonnardfd35af12014-06-23 14:10:13 +02001443 p = buf + 1;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001444 while( list_size > 0 )
1445 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001446 if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
1447 p[0] == MBEDTLS_ECP_PF_COMPRESSED )
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001448 {
Robert Cragie136884c2015-10-02 13:34:31 +01001449#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +02001450 ssl->handshake->ecdh_ctx.point_format = p[0];
Gilles Peskine064a85c2017-05-10 10:46:40 +02001451#endif
Robert Cragieae8535d2015-10-06 17:11:18 +01001452#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Robert Cragie136884c2015-10-02 13:34:31 +01001453 ssl->handshake->ecjpake_ctx.point_format = p[0];
1454#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001455 MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001456 return( 0 );
1457 }
1458
1459 list_size--;
1460 p++;
1461 }
1462
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001463 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001464 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1465 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001466 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001467}
Simon Butcherbb5e1c32018-06-08 11:14:43 +01001468#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
Robert Cragieae8535d2015-10-06 17:11:18 +01001469 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001470
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001471#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1472static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
1473 const unsigned char *buf,
1474 size_t len )
1475{
1476 int ret;
1477
1478 if( ssl->transform_negotiate->ciphersuite_info->key_exchange !=
1479 MBEDTLS_KEY_EXCHANGE_ECJPAKE )
1480 {
1481 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
1482 return( 0 );
1483 }
1484
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +02001485 /* If we got here, we no longer need our cached extension */
1486 mbedtls_free( ssl->handshake->ecjpake_cache );
1487 ssl->handshake->ecjpake_cache = NULL;
1488 ssl->handshake->ecjpake_cache_len = 0;
1489
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001490 if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
1491 buf, len ) ) != 0 )
1492 {
1493 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001494 mbedtls_ssl_send_alert_message(
1495 ssl,
1496 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1497 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001498 return( ret );
1499 }
1500
1501 return( 0 );
1502}
1503#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001504
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001505#if defined(MBEDTLS_SSL_ALPN)
1506static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001507 const unsigned char *buf, size_t len )
1508{
1509 size_t list_len, name_len;
1510 const char **p;
1511
1512 /* If we didn't send it, the server shouldn't send it */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001513 if( ssl->conf->alpn_list == NULL )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001514 {
1515 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching ALPN extension" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001516 mbedtls_ssl_send_alert_message(
1517 ssl,
1518 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1519 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001520 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001521 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001522
1523 /*
1524 * opaque ProtocolName<1..2^8-1>;
1525 *
1526 * struct {
1527 * ProtocolName protocol_name_list<2..2^16-1>
1528 * } ProtocolNameList;
1529 *
1530 * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
1531 */
1532
1533 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
1534 if( len < 4 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001535 {
1536 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1537 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001538 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001539 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001540
1541 list_len = ( buf[0] << 8 ) | buf[1];
1542 if( list_len != len - 2 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001543 {
1544 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1545 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001546 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001547 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001548
1549 name_len = buf[2];
1550 if( name_len != list_len - 1 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001551 {
1552 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1553 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001554 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001555 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001556
1557 /* Check that the server chosen protocol was in our list and save it */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001558 for( p = ssl->conf->alpn_list; *p != NULL; p++ )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001559 {
1560 if( name_len == strlen( *p ) &&
1561 memcmp( buf + 3, *p, name_len ) == 0 )
1562 {
1563 ssl->alpn_chosen = *p;
1564 return( 0 );
1565 }
1566 }
1567
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001568 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ALPN extension: no matching protocol" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001569 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1570 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001571 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001572}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001573#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001574
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001575/*
1576 * Parse HelloVerifyRequest. Only called after verifying the HS type.
1577 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001578#if defined(MBEDTLS_SSL_PROTO_DTLS)
1579static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001580{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001581 const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001582 int major_ver, minor_ver;
1583 unsigned char cookie_len;
1584
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001585 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001586
Gilles Peskine2414ce12019-09-27 14:02:44 +02001587 /* Check that there is enough room for:
1588 * - 2 bytes of version
1589 * - 1 byte of cookie_len
1590 */
1591 if( mbedtls_ssl_hs_hdr_len( ssl ) + 3 > ssl->in_msglen )
1592 {
1593 MBEDTLS_SSL_DEBUG_MSG( 1,
1594 ( "incoming HelloVerifyRequest message is too short" ) );
1595 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1596 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1597 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1598 }
1599
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001600 /*
1601 * struct {
1602 * ProtocolVersion server_version;
1603 * opaque cookie<0..2^8-1>;
1604 * } HelloVerifyRequest;
1605 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001606 MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001607 mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001608 p += 2;
1609
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02001610 /*
1611 * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1)
1612 * even is lower than our min version.
1613 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001614 if( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
1615 minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001616 major_ver > ssl->conf->max_major_ver ||
1617 minor_ver > ssl->conf->max_minor_ver )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001618 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001619 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server version" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001620
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001621 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1622 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001623
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001624 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001625 }
1626
1627 cookie_len = *p++;
Andres AG5a87c932016-09-26 14:53:05 +01001628 if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len )
1629 {
1630 MBEDTLS_SSL_DEBUG_MSG( 1,
1631 ( "cookie length does not match incoming message size" ) );
1632 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1633 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1634 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1635 }
Gilles Peskine99b67772019-09-27 14:00:36 +02001636 MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len );
Andres AG5a87c932016-09-26 14:53:05 +01001637
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001638 mbedtls_free( ssl->handshake->verify_cookie );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001639
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001640 ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001641 if( ssl->handshake->verify_cookie == NULL )
1642 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02001643 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", cookie_len ) );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02001644 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001645 }
1646
1647 memcpy( ssl->handshake->verify_cookie, p, cookie_len );
1648 ssl->handshake->verify_cookie_len = cookie_len;
1649
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02001650 /* Start over at ClientHello */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001651 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
1652 mbedtls_ssl_reset_checksum( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001653
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001654 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001655
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001656 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse hello verify request" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001657
1658 return( 0 );
1659}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001660#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001661
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001662static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001663{
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001664 int ret, i;
Paul Bakker23986e52011-04-24 08:57:21 +00001665 size_t n;
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001666 size_t ext_len;
Paul Bakker48916f92012-09-16 19:57:18 +00001667 unsigned char *buf, *ext;
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001668 unsigned char comp;
1669#if defined(MBEDTLS_ZLIB_SUPPORT)
1670 int accept_comp;
1671#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001672#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001673 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001674#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001675 int handshake_failure = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001676 const mbedtls_ssl_ciphersuite_t *suite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001677
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001678 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001679
Paul Bakker5121ce52009-01-03 21:22:43 +00001680 buf = ssl->in_msg;
1681
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001682 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001683 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001684 /* No alert on a read error. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001685 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001686 return( ret );
1687 }
1688
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001689 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001690 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001691#if defined(MBEDTLS_SSL_RENEGOTIATION)
1692 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001693 {
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001694 ssl->renego_records_seen++;
1695
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001696 if( ssl->conf->renego_max_records >= 0 &&
1697 ssl->renego_records_seen > ssl->conf->renego_max_records )
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001698 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001699 MBEDTLS_SSL_DEBUG_MSG( 1,
1700 ( "renegotiation requested, but not honored by server" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001701 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001702 }
1703
Hanno Becker8cf6b492017-05-08 11:06:19 +01001704 MBEDTLS_SSL_DEBUG_MSG( 1,
1705 ( "non-handshake message during renegotiation" ) );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01001706
1707 ssl->keep_current_message = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001708 return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO );
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001709 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001710#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001711
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001712 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001713 mbedtls_ssl_send_alert_message(
1714 ssl,
1715 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1716 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001717 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001718 }
1719
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001720#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001721 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001722 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001723 if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001724 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001725 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received hello verify request" ) );
1726 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001727 return( ssl_parse_hello_verify_request( ssl ) );
1728 }
1729 else
1730 {
1731 /* We made it through the verification process */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001732 mbedtls_free( ssl->handshake->verify_cookie );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001733 ssl->handshake->verify_cookie = NULL;
1734 ssl->handshake->verify_cookie_len = 0;
1735 }
1736 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001737#endif /* MBEDTLS_SSL_PROTO_DTLS */
Paul Bakker5121ce52009-01-03 21:22:43 +00001738
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001739 if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) ||
1740 buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO )
Paul Bakker5121ce52009-01-03 21:22:43 +00001741 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001742 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001743 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1744 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001745 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001746 }
1747
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001748 /*
1749 * 0 . 1 server_version
1750 * 2 . 33 random (maybe including 4 bytes of Unix time)
1751 * 34 . 34 session_id length = n
1752 * 35 . 34+n session_id
1753 * 35+n . 36+n cipher_suite
1754 * 37+n . 37+n compression_method
1755 *
1756 * 38+n . 39+n extensions length (optional)
1757 * 40+n . .. extensions
1758 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001759 buf += mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001760
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001761 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", buf + 0, 2 );
1762 mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001763 ssl->conf->transport, buf + 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001764
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001765 if( ssl->major_ver < ssl->conf->min_major_ver ||
1766 ssl->minor_ver < ssl->conf->min_minor_ver ||
1767 ssl->major_ver > ssl->conf->max_major_ver ||
1768 ssl->minor_ver > ssl->conf->max_minor_ver )
Paul Bakker1d29fb52012-09-28 13:28:45 +00001769 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001770 MBEDTLS_SSL_DEBUG_MSG( 1,
1771 ( "server version out of bounds - min: [%d:%d], server: [%d:%d], max: [%d:%d]",
1772 ssl->conf->min_major_ver,
1773 ssl->conf->min_minor_ver,
1774 ssl->major_ver, ssl->minor_ver,
1775 ssl->conf->max_major_ver,
1776 ssl->conf->max_minor_ver ) );
Paul Bakker1d29fb52012-09-28 13:28:45 +00001777
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001778 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1779 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Paul Bakker1d29fb52012-09-28 13:28:45 +00001780
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001781 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
Paul Bakker1d29fb52012-09-28 13:28:45 +00001782 }
1783
Andres Amaya Garcia6bce9cb2017-09-06 15:33:34 +01001784 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu",
1785 ( (uint32_t) buf[2] << 24 ) |
1786 ( (uint32_t) buf[3] << 16 ) |
1787 ( (uint32_t) buf[4] << 8 ) |
1788 ( (uint32_t) buf[5] ) ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001789
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001790 memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001791
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001792 n = buf[34];
Paul Bakker5121ce52009-01-03 21:22:43 +00001793
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001794 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 2, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001795
Paul Bakker48916f92012-09-16 19:57:18 +00001796 if( n > 32 )
1797 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001798 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001799 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1800 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001801 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001802 }
1803
Manuel Pégourié-Gonnarda6e5bd52015-07-23 12:14:13 +02001804 if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +00001805 {
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001806 ext_len = ( ( buf[38 + n] << 8 )
1807 | ( buf[39 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001808
Paul Bakker48916f92012-09-16 19:57:18 +00001809 if( ( ext_len > 0 && ext_len < 4 ) ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001810 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len )
Paul Bakker48916f92012-09-16 19:57:18 +00001811 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001812 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001813 mbedtls_ssl_send_alert_message(
1814 ssl,
1815 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1816 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001817 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001818 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001819 }
Manuel Pégourié-Gonnarda6e5bd52015-07-23 12:14:13 +02001820 else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n )
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001821 {
1822 ext_len = 0;
1823 }
1824 else
1825 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001826 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001827 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1828 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001829 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001830 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001831
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001832 /* ciphersuite (used later) */
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001833 i = ( buf[35 + n] << 8 ) | buf[36 + n];
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001834
1835 /*
1836 * Read and check compression
1837 */
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001838 comp = buf[37 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +00001839
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001840#if defined(MBEDTLS_ZLIB_SUPPORT)
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001841 /* See comments in ssl_write_client_hello() */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001842#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001843 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001844 accept_comp = 0;
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001845 else
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001846#endif
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001847 accept_comp = 1;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001848
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001849 if( comp != MBEDTLS_SSL_COMPRESS_NULL &&
1850 ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) )
1851#else /* MBEDTLS_ZLIB_SUPPORT */
1852 if( comp != MBEDTLS_SSL_COMPRESS_NULL )
1853#endif/* MBEDTLS_ZLIB_SUPPORT */
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001854 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001855 MBEDTLS_SSL_DEBUG_MSG( 1,
1856 ( "server hello, bad compression: %d", comp ) );
1857 mbedtls_ssl_send_alert_message(
1858 ssl,
1859 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1860 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001861 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001862 }
1863
Paul Bakker380da532012-04-18 16:10:25 +00001864 /*
1865 * Initialize update checksum functions
1866 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01001867 ssl->transform_negotiate->ciphersuite_info =
1868 mbedtls_ssl_ciphersuite_from_id( i );
Paul Bakker68884e32013-01-07 18:20:04 +01001869
1870 if( ssl->transform_negotiate->ciphersuite_info == NULL )
1871 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01001872 MBEDTLS_SSL_DEBUG_MSG( 1,
1873 ( "ciphersuite info for %04x not found", i ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001874 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1875 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001876 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +01001877 }
Paul Bakker380da532012-04-18 16:10:25 +00001878
Hanno Becker8cf6b492017-05-08 11:06:19 +01001879 mbedtls_ssl_optimize_checksum( ssl,
1880 ssl->transform_negotiate->ciphersuite_info );
Manuel Pégourié-Gonnard3c599f12014-03-10 13:25:07 +01001881
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001882 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
1883 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 35, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001884
1885 /*
1886 * Check if the session can be resumed
1887 */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001888 if( ssl->handshake->resume == 0 || n == 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001889#if defined(MBEDTLS_SSL_RENEGOTIATION)
1890 ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001891#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001892 ssl->session_negotiate->ciphersuite != i ||
1893 ssl->session_negotiate->compression != comp ||
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001894 ssl->session_negotiate->id_len != n ||
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001895 memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001896 {
1897 ssl->state++;
Paul Bakker0a597072012-09-25 21:55:46 +00001898 ssl->handshake->resume = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001899#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01001900 ssl->session_negotiate->start = mbedtls_time( NULL );
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001901#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001902 ssl->session_negotiate->ciphersuite = i;
1903 ssl->session_negotiate->compression = comp;
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001904 ssl->session_negotiate->id_len = n;
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001905 memcpy( ssl->session_negotiate->id, buf + 35, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001906 }
1907 else
1908 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001909 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00001910
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001911 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Paul Bakkerff60ee62010-03-16 21:09:09 +00001912 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001913 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001914 mbedtls_ssl_send_alert_message(
1915 ssl,
1916 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1917 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Paul Bakkerff60ee62010-03-16 21:09:09 +00001918 return( ret );
1919 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001920 }
1921
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001922 MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +00001923 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001924
Manuel Pégourié-Gonnard60884a12015-09-16 11:13:41 +02001925 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", i ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001926 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d",
1927 buf[37 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001928
Andrzej Kurek66080962018-04-25 05:06:07 -04001929 /*
1930 * Perform cipher suite validation in same way as in ssl_write_client_hello.
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +01001931 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001932 i = 0;
1933 while( 1 )
1934 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001935 if( ssl->conf->ciphersuite_list[ssl->minor_ver][i] == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001936 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001937 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001938 mbedtls_ssl_send_alert_message(
1939 ssl,
1940 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1941 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001942 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001943 }
1944
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001945 if( ssl->conf->ciphersuite_list[ssl->minor_ver][i++] ==
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001946 ssl->session_negotiate->ciphersuite )
1947 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001948 break;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001949 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001950 }
1951
Hanno Becker8cf6b492017-05-08 11:06:19 +01001952 suite_info = mbedtls_ssl_ciphersuite_from_id(
1953 ssl->session_negotiate->ciphersuite );
1954 if( ssl_validate_ciphersuite( suite_info, ssl, ssl->minor_ver,
1955 ssl->minor_ver ) != 0 )
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +01001956 {
1957 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001958 mbedtls_ssl_send_alert_message(
1959 ssl,
1960 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1961 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +01001962 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1963 }
1964
Hanno Becker8cf6b492017-05-08 11:06:19 +01001965 MBEDTLS_SSL_DEBUG_MSG( 3,
1966 ( "server hello, chosen ciphersuite: %s", suite_info->name ) );
Mohammad Azim Khan0acbd7d2018-04-18 19:35:00 +01001967
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001968 if( comp != MBEDTLS_SSL_COMPRESS_NULL
1969#if defined(MBEDTLS_ZLIB_SUPPORT)
1970 && comp != MBEDTLS_SSL_COMPRESS_DEFLATE
Paul Bakker2770fbd2012-07-03 13:30:23 +00001971#endif
1972 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001973 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001974 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001975 mbedtls_ssl_send_alert_message(
1976 ssl,
1977 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1978 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001979 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001980 }
Paul Bakker48916f92012-09-16 19:57:18 +00001981 ssl->session_negotiate->compression = comp;
Paul Bakker5121ce52009-01-03 21:22:43 +00001982
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001983 ext = buf + 40 + n;
Paul Bakker48916f92012-09-16 19:57:18 +00001984
Hanno Becker8cf6b492017-05-08 11:06:19 +01001985 MBEDTLS_SSL_DEBUG_MSG( 2,
1986 ( "server hello, total extension length: %d", ext_len ) );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001987
Paul Bakker48916f92012-09-16 19:57:18 +00001988 while( ext_len )
1989 {
1990 unsigned int ext_id = ( ( ext[0] << 8 )
1991 | ( ext[1] ) );
1992 unsigned int ext_size = ( ( ext[2] << 8 )
1993 | ( ext[3] ) );
1994
1995 if( ext_size + 4 > ext_len )
1996 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001997 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01001998 mbedtls_ssl_send_alert_message(
1999 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2000 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002001 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00002002 }
2003
2004 switch( ext_id )
2005 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002006 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
2007 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
2008#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00002009 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01002010#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002011
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02002012 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4,
2013 ext_size ) ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00002014 return( ret );
2015
2016 break;
2017
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002018#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2019 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
Hanno Becker8cf6b492017-05-08 11:06:19 +01002020 MBEDTLS_SSL_DEBUG_MSG( 3,
2021 ( "found max_fragment_length extension" ) );
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02002022
2023 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
2024 ext + 4, ext_size ) ) != 0 )
2025 {
2026 return( ret );
2027 }
2028
2029 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002030#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02002031
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002032#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
2033 case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
2034 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002035
2036 if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
2037 ext + 4, ext_size ) ) != 0 )
2038 {
2039 return( ret );
2040 }
2041
2042 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002043#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002044
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002045#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2046 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
2047 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002048
2049 if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl,
2050 ext + 4, ext_size ) ) != 0 )
2051 {
2052 return( ret );
2053 }
2054
2055 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002056#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002057
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002058#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2059 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
Hanno Becker8cf6b492017-05-08 11:06:19 +01002060 MBEDTLS_SSL_DEBUG_MSG( 3,
2061 ( "found extended_master_secret extension" ) );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002062
2063 if( ( ret = ssl_parse_extended_ms_ext( ssl,
2064 ext + 4, ext_size ) ) != 0 )
2065 {
2066 return( ret );
2067 }
2068
2069 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002070#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002071
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002072#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2073 case MBEDTLS_TLS_EXT_SESSION_TICKET:
2074 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02002075
2076 if( ( ret = ssl_parse_session_ticket_ext( ssl,
2077 ext + 4, ext_size ) ) != 0 )
2078 {
2079 return( ret );
2080 }
2081
2082 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002083#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02002084
Robert Cragie136884c2015-10-02 13:34:31 +01002085#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01002086 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002087 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
Hanno Becker8cf6b492017-05-08 11:06:19 +01002088 MBEDTLS_SSL_DEBUG_MSG( 3,
2089 ( "found supported_point_formats extension" ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002090
2091 if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
2092 ext + 4, ext_size ) ) != 0 )
2093 {
2094 return( ret );
2095 }
2096
2097 break;
Robert Cragieae8535d2015-10-06 17:11:18 +01002098#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
2099 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002100
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02002101#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2102 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
2103 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) );
2104
2105 if( ( ret = ssl_parse_ecjpake_kkpp( ssl,
2106 ext + 4, ext_size ) ) != 0 )
2107 {
2108 return( ret );
2109 }
2110
2111 break;
2112#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002114#if defined(MBEDTLS_SSL_ALPN)
2115 case MBEDTLS_TLS_EXT_ALPN:
2116 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002117
2118 if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 )
2119 return( ret );
2120
2121 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002122#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002123
Paul Bakker48916f92012-09-16 19:57:18 +00002124 default:
Hanno Becker8cf6b492017-05-08 11:06:19 +01002125 MBEDTLS_SSL_DEBUG_MSG( 3,
2126 ( "unknown extension found: %d (ignoring)", ext_id ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002127 }
2128
2129 ext_len -= 4 + ext_size;
2130 ext += 4 + ext_size;
2131
2132 if( ext_len > 0 && ext_len < 4 )
2133 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002134 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
2135 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00002136 }
2137 }
2138
2139 /*
2140 * Renegotiation security checks
2141 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002142 if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Hanno Becker8cf6b492017-05-08 11:06:19 +01002143 ssl->conf->allow_legacy_renegotiation ==
2144 MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00002145 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002146 MBEDTLS_SSL_DEBUG_MSG( 1,
2147 ( "legacy renegotiation, breaking off handshake" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002148 handshake_failure = 1;
2149 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002150#if defined(MBEDTLS_SSL_RENEGOTIATION)
2151 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2152 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Paul Bakker48916f92012-09-16 19:57:18 +00002153 renegotiation_info_seen == 0 )
2154 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002155 MBEDTLS_SSL_DEBUG_MSG( 1,
2156 ( "renegotiation_info extension missing (secure)" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002157 handshake_failure = 1;
2158 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002159 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2160 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Hanno Becker8cf6b492017-05-08 11:06:19 +01002161 ssl->conf->allow_legacy_renegotiation ==
2162 MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00002163 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002164 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002165 handshake_failure = 1;
2166 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002167 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2168 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002169 renegotiation_info_seen == 1 )
2170 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002171 MBEDTLS_SSL_DEBUG_MSG( 1,
2172 ( "renegotiation_info extension present (legacy)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002173 handshake_failure = 1;
2174 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002175#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002176
2177 if( handshake_failure == 1 )
2178 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002179 mbedtls_ssl_send_alert_message(
2180 ssl,
2181 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2182 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002183 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00002184 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002185
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002186 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002187
2188 return( 0 );
2189}
2190
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002191#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2192 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Hanno Becker8cf6b492017-05-08 11:06:19 +01002193static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl,
2194 unsigned char **p,
Paul Bakker29e1f122013-04-16 13:07:56 +02002195 unsigned char *end )
2196{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002197 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker29e1f122013-04-16 13:07:56 +02002198
Paul Bakker29e1f122013-04-16 13:07:56 +02002199 /*
2200 * Ephemeral DH parameters:
2201 *
2202 * struct {
2203 * opaque dh_p<1..2^16-1>;
2204 * opaque dh_g<1..2^16-1>;
2205 * opaque dh_Ys<1..2^16-1>;
2206 * } ServerDHParams;
2207 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01002208 if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx,
2209 p, end ) ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002210 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002211 MBEDTLS_SSL_DEBUG_RET( 2, ( "mbedtls_dhm_read_params" ), ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002212 return( ret );
2213 }
2214
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02002215 if( ssl->handshake->dhm_ctx.len * 8 < ssl->conf->dhm_min_bitlen )
Paul Bakker29e1f122013-04-16 13:07:56 +02002216 {
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02002217 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHM prime too short: %d < %d",
2218 ssl->handshake->dhm_ctx.len * 8,
2219 ssl->conf->dhm_min_bitlen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002220 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002221 }
2222
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002223 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
2224 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
2225 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +02002226
2227 return( ret );
2228}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002229#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2230 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002232#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2233 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2234 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
2235 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2236 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2237static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002238{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002239 const mbedtls_ecp_curve_info *curve_info;
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002240
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002241 curve_info = mbedtls_ecp_curve_info_from_grp_id( ssl->handshake->ecdh_ctx.grp.id );
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002242 if( curve_info == NULL )
2243 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002244 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2245 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002246 }
2247
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002248 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002249
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02002250#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02002251 if( mbedtls_ssl_check_curve( ssl, ssl->handshake->ecdh_ctx.grp.id ) != 0 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002252#else
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002253 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
2254 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002255#endif
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002256 return( -1 );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002257
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002258 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002259
2260 return( 0 );
2261}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002262#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2263 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2264 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2265 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2266 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002267
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002268#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2269 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2270 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2271static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
Paul Bakker29e1f122013-04-16 13:07:56 +02002272 unsigned char **p,
2273 unsigned char *end )
2274{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002275 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker29e1f122013-04-16 13:07:56 +02002276
Paul Bakker29e1f122013-04-16 13:07:56 +02002277 /*
2278 * Ephemeral ECDH parameters:
2279 *
2280 * struct {
2281 * ECParameters curve_params;
2282 * ECPoint public;
2283 * } ServerECDHParams;
2284 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002285 if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx,
Paul Bakker29e1f122013-04-16 13:07:56 +02002286 (const unsigned char **) p, end ) ) != 0 )
2287 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002288 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_read_params" ), ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002289 return( ret );
2290 }
2291
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002292 if( ssl_check_server_ecdh_params( ssl ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002293 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002294 MBEDTLS_SSL_DEBUG_MSG( 1,
2295 ( "bad server key exchange message (ECDHE curve)" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002296 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002297 }
2298
Paul Bakker29e1f122013-04-16 13:07:56 +02002299 return( ret );
2300}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002301#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2302 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2303 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002304
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002305#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
2306static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002307 unsigned char **p,
2308 unsigned char *end )
2309{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002310 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002311 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02002312 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002313
2314 /*
2315 * PSK parameters:
2316 *
2317 * opaque psk_identity_hint<0..2^16-1>;
2318 */
Hanno Becker63c706f2018-10-08 13:40:50 +01002319 if( end - (*p) < 2 )
Krzysztof Stachowiak9e1839b2018-03-14 11:20:46 +01002320 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002321 MBEDTLS_SSL_DEBUG_MSG( 1,
2322 ( "bad server key exchange message (psk_identity_hint length)" ) );
Krzysztof Stachowiak9e1839b2018-03-14 11:20:46 +01002323 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2324 }
Manuel Pégourié-Gonnard59b9fe22013-10-15 11:55:33 +02002325 len = (*p)[0] << 8 | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002326 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002327
Hanno Beckerd72fab92018-10-10 15:48:39 +01002328 if( end - (*p) < (int) len )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002329 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002330 MBEDTLS_SSL_DEBUG_MSG( 1,
2331 ( "bad server key exchange message (psk_identity_hint length)" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002332 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002333 }
2334
Manuel Pégourié-Gonnard9d624122016-02-22 11:10:14 +01002335 /*
2336 * Note: we currently ignore the PKS identity hint, as we only allow one
2337 * PSK to be provisionned on the client. This could be changed later if
2338 * someone needs that feature.
2339 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002340 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002341 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002342
2343 return( ret );
2344}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002345#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002346
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002347#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
2348 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002349/*
2350 * Generate a pre-master secret and encrypt it with the server's RSA key
2351 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002352static int ssl_write_encrypted_pms( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002353 size_t offset, size_t *olen,
2354 size_t pms_offset )
2355{
2356 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002357 size_t len_bytes = ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002358 unsigned char *p = ssl->handshake->premaster + pms_offset;
2359
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02002360 if( offset + len_bytes > MBEDTLS_SSL_MAX_CONTENT_LEN )
2361 {
2362 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) );
2363 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2364 }
2365
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002366 /*
2367 * Generate (part of) the pre-master as
2368 * struct {
2369 * ProtocolVersion client_version;
2370 * opaque random[46];
2371 * } PreMasterSecret;
2372 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01002373 mbedtls_ssl_write_version( ssl->conf->max_major_ver,
2374 ssl->conf->max_minor_ver,
2375 ssl->conf->transport, p );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002376
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002377 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p + 2, 46 ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002378 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002379 MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002380 return( ret );
2381 }
2382
2383 ssl->handshake->pmslen = 48;
2384
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002385 if( ssl->session_negotiate->peer_cert == NULL )
2386 {
2387 MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
2388 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
2389 }
2390
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002391 /*
2392 * Now write it out, encrypted
2393 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002394 if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
2395 MBEDTLS_PK_RSA ) )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002396 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002397 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
2398 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002399 }
2400
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002401 if( ( ret = mbedtls_pk_encrypt( &ssl->session_negotiate->peer_cert->pk,
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002402 p, ssl->handshake->pmslen,
2403 ssl->out_msg + offset + len_bytes, olen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002404 MBEDTLS_SSL_MAX_CONTENT_LEN - offset - len_bytes,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002405 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002406 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002407 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_rsa_pkcs1_encrypt", ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002408 return( ret );
2409 }
2410
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002411#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2412 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002413 if( len_bytes == 2 )
2414 {
2415 ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 );
2416 ssl->out_msg[offset+1] = (unsigned char)( *olen );
2417 *olen += 2;
2418 }
2419#endif
2420
2421 return( 0 );
2422}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002423#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
2424 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002425
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002426#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard5c2a7ca2015-10-23 08:48:41 +02002427#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2428 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2429 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002430static int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl,
Paul Bakker29e1f122013-04-16 13:07:56 +02002431 unsigned char **p,
2432 unsigned char *end,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002433 mbedtls_md_type_t *md_alg,
2434 mbedtls_pk_type_t *pk_alg )
Paul Bakker29e1f122013-04-16 13:07:56 +02002435{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02002436 ((void) ssl);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002437 *md_alg = MBEDTLS_MD_NONE;
2438 *pk_alg = MBEDTLS_PK_NONE;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002439
2440 /* Only in TLS 1.2 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002441 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002442 {
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002443 return( 0 );
2444 }
Paul Bakker29e1f122013-04-16 13:07:56 +02002445
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002446 if( (*p) + 2 > end )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002447 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002448
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002449 /*
2450 * Get hash algorithm
2451 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01002452 if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) )
2453 == MBEDTLS_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002454 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002455 MBEDTLS_SSL_DEBUG_MSG( 1,
2456 ( "Server used unsupported HashAlgorithm %d", *(p)[0] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002457 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002458 }
2459
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002460 /*
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002461 * Get signature algorithm
2462 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01002463 if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) )
2464 == MBEDTLS_PK_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002465 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002466 MBEDTLS_SSL_DEBUG_MSG( 1,
2467 ( "server used unsupported SignatureAlgorithm %d", (*p)[1] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002468 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002469 }
2470
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02002471 /*
2472 * Check if the hash is acceptable
2473 */
2474 if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 )
2475 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002476 MBEDTLS_SSL_DEBUG_MSG( 1,
2477 ( "server used HashAlgorithm %d that was not offered", *(p)[0] ) );
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02002478 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2479 }
2480
Hanno Becker8cf6b492017-05-08 11:06:19 +01002481 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d",
2482 (*p)[1] ) );
2483 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d",
2484 (*p)[0] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02002485 *p += 2;
2486
2487 return( 0 );
2488}
Manuel Pégourié-Gonnard5c2a7ca2015-10-23 08:48:41 +02002489#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2490 MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2491 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002492#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02002493
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002494#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2495 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2496static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002497{
2498 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002499 const mbedtls_ecp_keypair *peer_key;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002500
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002501 if( ssl->session_negotiate->peer_cert == NULL )
2502 {
2503 MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
2504 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
2505 }
2506
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002507 if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
2508 MBEDTLS_PK_ECKEY ) )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002509 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002510 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
2511 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002512 }
2513
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002514 peer_key = mbedtls_pk_ec( ssl->session_negotiate->peer_cert->pk );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002515
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002516 if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,
2517 MBEDTLS_ECDH_THEIRS ) ) != 0 )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002518 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002519 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002520 return( ret );
2521 }
2522
2523 if( ssl_check_server_ecdh_params( ssl ) != 0 )
2524 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002525 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) );
2526 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002527 }
2528
2529 return( ret );
2530}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002531#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2532 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002533
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002534static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
Paul Bakker41c83d32013-03-20 14:39:14 +01002535{
Paul Bakker23986e52011-04-24 08:57:21 +00002536 int ret;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002537 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2538 ssl->transform_negotiate->ciphersuite_info;
Andres Amaya Garcia53c77cc2017-06-27 16:15:06 +01002539 unsigned char *p = NULL, *end = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00002540
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002541 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002542
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002543#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
2544 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00002545 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002546 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002547 ssl->state++;
2548 return( 0 );
2549 }
Manuel Pégourié-Gonnardbac0e3b2013-10-15 11:54:47 +02002550 ((void) p);
2551 ((void) end);
2552#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002553
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002554#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2555 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2556 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
2557 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002558 {
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002559 if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 )
2560 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002561 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002562 mbedtls_ssl_send_alert_message(
2563 ssl,
2564 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2565 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002566 return( ret );
2567 }
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002568
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002569 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002570 ssl->state++;
2571 return( 0 );
2572 }
2573 ((void) p);
2574 ((void) end);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002575#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2576 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002577
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002578 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002579 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002580 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002581 return( ret );
2582 }
2583
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002584 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002585 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002586 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002587 mbedtls_ssl_send_alert_message(
2588 ssl,
2589 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2590 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002591 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002592 }
2593
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002594 /*
2595 * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
2596 * doesn't use a psk_identity_hint
2597 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002598 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002599 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002600 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2601 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Paul Bakker188c8de2013-04-19 09:13:37 +02002602 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002603 /* Current message is probably either
2604 * CertificateRequest or ServerHelloDone */
2605 ssl->keep_current_message = 1;
Paul Bakker188c8de2013-04-19 09:13:37 +02002606 goto exit;
2607 }
2608
Hanno Becker8cf6b492017-05-08 11:06:19 +01002609 MBEDTLS_SSL_DEBUG_MSG( 1,
2610 ( "server key exchange message must not be skipped" ) );
2611 mbedtls_ssl_send_alert_message(
2612 ssl,
2613 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2614 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002615
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002616 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002617 }
2618
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002619 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Paul Bakker3b6a07b2013-03-21 11:56:50 +01002620 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002621 MBEDTLS_SSL_DEBUG_BUF( 3, "server key exchange", p, end - p );
Paul Bakker3b6a07b2013-03-21 11:56:50 +01002622
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002623#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
2624 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2625 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
2626 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2627 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002628 {
2629 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
2630 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002631 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002632 mbedtls_ssl_send_alert_message(
2633 ssl,
2634 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2635 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002636 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002637 }
2638 } /* FALLTROUGH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002639#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002640
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002641#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \
2642 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
2643 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2644 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002645 ; /* nothing more to do */
2646 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002647#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||
2648 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
2649#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2650 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
2651 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
2652 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00002653 {
Paul Bakker29e1f122013-04-16 13:07:56 +02002654 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01002655 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002656 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002657 mbedtls_ssl_send_alert_message(
2658 ssl,
2659 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2660 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002661 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002662 }
2663 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002664 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002665#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2666 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
2667#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2668 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
2669 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
2670 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
2671 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
2672 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002673 {
2674 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
2675 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002676 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002677 mbedtls_ssl_send_alert_message(
2678 ssl,
2679 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2680 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002681 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker41c83d32013-03-20 14:39:14 +01002682 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002683 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002684 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002685#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2686 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2687 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002688#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2689 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
2690 {
2691 ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
2692 p, end - p );
2693 if( ret != 0 )
2694 {
2695 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002696 mbedtls_ssl_send_alert_message(
2697 ssl,
2698 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2699 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002700 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2701 }
2702 }
2703 else
2704#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002705 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002706 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2707 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002708 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002709
Hanno Becker1aa267c2017-04-28 17:08:27 +01002710#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)
2711 if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002712 {
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00002713 size_t sig_len, hashlen;
2714 unsigned char hash[64];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002715 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
2716 mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
2717 unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00002718 size_t params_len = p - params;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002719
Paul Bakker29e1f122013-04-16 13:07:56 +02002720 /*
2721 * Handle the digitally-signed structure
2722 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002723#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2724 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002725 {
Paul Bakker9659dae2013-08-28 16:21:34 +02002726 if( ssl_parse_signature_algorithm( ssl, &p, end,
2727 &md_alg, &pk_alg ) != 0 )
2728 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002729 MBEDTLS_SSL_DEBUG_MSG( 1,
2730 ( "bad server key exchange message" ) );
2731 mbedtls_ssl_send_alert_message(
2732 ssl,
2733 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2734 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002735 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker9659dae2013-08-28 16:21:34 +02002736 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002737
Hanno Becker8cf6b492017-05-08 11:06:19 +01002738 if( pk_alg !=
2739 mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002740 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002741 MBEDTLS_SSL_DEBUG_MSG( 1,
2742 ( "bad server key exchange message" ) );
2743 mbedtls_ssl_send_alert_message(
2744 ssl,
2745 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2746 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002747 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002748 }
2749 }
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02002750 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002751#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2752#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2753 defined(MBEDTLS_SSL_PROTO_TLS1_1)
2754 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02002755 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002756 pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002757
Paul Bakker9659dae2013-08-28 16:21:34 +02002758 /* Default hash for ECDSA is SHA-1 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002759 if( pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE )
2760 md_alg = MBEDTLS_MD_SHA1;
Paul Bakker9659dae2013-08-28 16:21:34 +02002761 }
2762 else
2763#endif
2764 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002765 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2766 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker9659dae2013-08-28 16:21:34 +02002767 }
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002768
2769 /*
2770 * Read signature
2771 */
Krzysztof Stachowiakb3e8f9e2018-03-14 11:40:55 +01002772 if( p > end - 2 )
2773 {
2774 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002775 mbedtls_ssl_send_alert_message(
2776 ssl,
2777 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2778 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Krzysztof Stachowiakb3e8f9e2018-03-14 11:40:55 +01002779 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2780 }
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002781 sig_len = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00002782 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002783
Krzysztof Stachowiakb5609f32018-03-14 11:41:47 +01002784 if( p != end - sig_len )
Paul Bakker41c83d32013-03-20 14:39:14 +01002785 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002786 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002787 mbedtls_ssl_send_alert_message(
2788 ssl,
2789 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2790 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002791 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker41c83d32013-03-20 14:39:14 +01002792 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002793
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002794 MBEDTLS_SSL_DEBUG_BUF( 3, "signature", p, sig_len );
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02002795
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002796 /*
2797 * Compute the hash that has been signed
2798 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002799#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2800 defined(MBEDTLS_SSL_PROTO_TLS1_1)
2801 if( md_alg == MBEDTLS_MD_NONE )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00002802 {
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002803 hashlen = 36;
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01002804 ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash, params,
2805 params_len );
2806 if( ret != 0 )
Andres Amaya Garciaf0e521e2017-06-28 12:11:42 +01002807 return( ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002808 }
2809 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002810#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
2811 MBEDTLS_SSL_PROTO_TLS1_1 */
2812#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2813 defined(MBEDTLS_SSL_PROTO_TLS1_2)
2814 if( md_alg != MBEDTLS_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002815 {
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002816 /* Info from md_alg will be used instead */
2817 hashlen = 0;
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01002818 ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, params,
2819 params_len, md_alg );
2820 if( ret != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002821 return( ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002822 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002823 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002824#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
2825 MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02002826 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002827 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2828 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02002829 }
Paul Bakker29e1f122013-04-16 13:07:56 +02002830
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002831 MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen != 0 ? hashlen :
2832 (unsigned int) ( mbedtls_md_get_size( mbedtls_md_info_from_type( md_alg ) ) ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02002833
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002834 if( ssl->session_negotiate->peer_cert == NULL )
2835 {
2836 MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002837 mbedtls_ssl_send_alert_message(
2838 ssl,
2839 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2840 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002841 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
2842 }
2843
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002844 /*
2845 * Verify signature
2846 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01002847 if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
2848 pk_alg ) )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002849 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002850 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002851 mbedtls_ssl_send_alert_message(
2852 ssl,
2853 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2854 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002855 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002856 }
2857
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002858 if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk,
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02002859 md_alg, hash, hashlen, p, sig_len ) ) != 0 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002860 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01002861 mbedtls_ssl_send_alert_message(
2862 ssl,
2863 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2864 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002865 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02002866 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00002867 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002868 }
Hanno Becker1aa267c2017-04-28 17:08:27 +01002869#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002870
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002871exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00002872 ssl->state++;
2873
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002874 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002875
2876 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002877}
2878
Hanno Becker1aa267c2017-04-28 17:08:27 +01002879#if ! defined(MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002880static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002881{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002882 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2883 ssl->transform_negotiate->ciphersuite_info;
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002884
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002885 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002886
Hanno Becker1aa267c2017-04-28 17:08:27 +01002887 if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002888 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002889 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002890 ssl->state++;
2891 return( 0 );
2892 }
2893
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002894 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2895 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002896}
Hanno Becker1aa267c2017-04-28 17:08:27 +01002897#else /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002898static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002899{
2900 int ret;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002901 unsigned char *buf;
2902 size_t n = 0;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002903 size_t cert_type_len = 0, dn_len = 0;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002904 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2905 ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002906
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002907 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002908
Hanno Becker1aa267c2017-04-28 17:08:27 +01002909 if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002910 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002911 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002912 ssl->state++;
2913 return( 0 );
2914 }
2915
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002916 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002917 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002918 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
2919 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002920 }
2921
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002922 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
2923 {
2924 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01002925 mbedtls_ssl_send_alert_message(
2926 ssl,
2927 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2928 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002929 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
2930 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002931
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002932 ssl->state++;
2933 ssl->client_auth = ( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST );
Paul Bakker5121ce52009-01-03 21:22:43 +00002934
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002935 MBEDTLS_SSL_DEBUG_MSG( 3, ( "got %s certificate request",
Paul Bakker5121ce52009-01-03 21:22:43 +00002936 ssl->client_auth ? "a" : "no" ) );
2937
Paul Bakker926af752012-11-23 13:38:07 +01002938 if( ssl->client_auth == 0 )
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002939 {
2940 /* Current message is probably the ServerHelloDone */
2941 ssl->keep_current_message = 1;
Paul Bakker926af752012-11-23 13:38:07 +01002942 goto exit;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002943 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002944
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02002945 /*
2946 * struct {
2947 * ClientCertificateType certificate_types<1..2^8-1>;
2948 * SignatureAndHashAlgorithm
2949 * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only
2950 * DistinguishedName certificate_authorities<0..2^16-1>;
2951 * } CertificateRequest;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002952 *
2953 * Since we only support a single certificate on clients, let's just
2954 * ignore all the information that's supposed to help us pick a
2955 * certificate.
2956 *
2957 * We could check that our certificate matches the request, and bail out
2958 * if it doesn't, but it's simpler to just send the certificate anyway,
2959 * and give the server the opportunity to decide if it should terminate
2960 * the connection when it doesn't like our certificate.
2961 *
2962 * Same goes for the hash in TLS 1.2's signature_algorithms: at this
2963 * point we only have one hash available (see comments in
Simon Butcherc0957bd2016-03-01 13:16:57 +00002964 * write_certificate_verify), so let's just use what we have.
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002965 *
2966 * However, we still minimally parse the message to check it is at least
2967 * superficially sane.
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02002968 */
Paul Bakker926af752012-11-23 13:38:07 +01002969 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002970
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002971 /* certificate_types */
Krzysztof Stachowiak314f1612018-04-05 10:20:09 +02002972 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) )
2973 {
2974 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
2975 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2976 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
2977 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
2978 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002979 cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )];
Paul Bakker926af752012-11-23 13:38:07 +01002980 n = cert_type_len;
2981
Krzysztof Stachowiak3d8663b2018-03-20 11:19:50 +01002982 /*
Krzysztof Stachowiakaffb4f82018-04-05 14:48:55 +02002983 * In the subsequent code there are two paths that read from buf:
Krzysztof Stachowiak3d8663b2018-03-20 11:19:50 +01002984 * * the length of the signature algorithms field (if minor version of
2985 * SSL is 3),
2986 * * distinguished name length otherwise.
2987 * Both reach at most the index:
2988 * ...hdr_len + 2 + n,
2989 * therefore the buffer length at this point must be greater than that
2990 * regardless of the actual code path.
2991 */
Hanno Becker78d5d822018-08-16 15:51:34 +01002992 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
Paul Bakker926af752012-11-23 13:38:07 +01002993 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002994 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002995 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2996 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002997 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
Paul Bakker926af752012-11-23 13:38:07 +01002998 }
2999
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003000 /* supported_signature_algorithms */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003001#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3002 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01003003 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01003004 size_t sig_alg_len =
3005 ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
3006 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
Simon Butcher99000142016-10-13 17:21:01 +01003007#if defined(MBEDTLS_DEBUG_C)
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003008 unsigned char* sig_alg;
Simon Butcher99000142016-10-13 17:21:01 +01003009 size_t i;
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003010#endif
Simon Butcher99000142016-10-13 17:21:01 +01003011
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003012 /*
Krzysztof Stachowiakaffb4f82018-04-05 14:48:55 +02003013 * The furthest access in buf is in the loop few lines below:
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003014 * sig_alg[i + 1],
3015 * where:
3016 * sig_alg = buf + ...hdr_len + 3 + n,
3017 * max(i) = sig_alg_len - 1.
Krzysztof Stachowiakaffb4f82018-04-05 14:48:55 +02003018 * Therefore the furthest access is:
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003019 * buf[...hdr_len + 3 + n + sig_alg_len - 1 + 1],
3020 * which reduces to:
3021 * buf[...hdr_len + 3 + n + sig_alg_len],
3022 * which is one less than we need the buf to be.
3023 */
Hanno Becker8cf6b492017-05-08 11:06:19 +01003024 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl )
3025 + 3 + n + sig_alg_len )
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003026 {
3027 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01003028 mbedtls_ssl_send_alert_message(
3029 ssl,
3030 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3031 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Krzysztof Stachowiak071f9a32018-03-20 14:09:53 +01003032 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
3033 }
3034
3035#if defined(MBEDTLS_DEBUG_C)
3036 sig_alg = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n;
Simon Butcher99000142016-10-13 17:21:01 +01003037 for( i = 0; i < sig_alg_len; i += 2 )
3038 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01003039 MBEDTLS_SSL_DEBUG_MSG( 3,
3040 ( "Supported Signature Algorithm found: %d,%d",
3041 sig_alg[i], sig_alg[i + 1] ) );
Simon Butcher99000142016-10-13 17:21:01 +01003042 }
3043#endif
Paul Bakker926af752012-11-23 13:38:07 +01003044
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003045 n += 2 + sig_alg_len;
Paul Bakkerf7abd422013-04-16 13:15:56 +02003046 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003047#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker926af752012-11-23 13:38:07 +01003048
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003049 /* certificate_authorities */
3050 dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
3051 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01003052
3053 n += dn_len;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003054 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n )
Paul Bakker926af752012-11-23 13:38:07 +01003055 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003056 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003057 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3058 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003059 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
Paul Bakker926af752012-11-23 13:38:07 +01003060 }
3061
3062exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003063 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003064
3065 return( 0 );
3066}
Hanno Becker1aa267c2017-04-28 17:08:27 +01003067#endif /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003068
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003069static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003070{
3071 int ret;
3072
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003073 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003074
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003075 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003076 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003077 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3078 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003079 }
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003080
3081 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
3082 {
3083 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
3084 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
3085 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003086
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003087 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ||
3088 ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003089 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003090 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003091 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3092 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003093 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003094 }
3095
3096 ssl->state++;
3097
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003098#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003099 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003100 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003101#endif
3102
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003103 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003104
3105 return( 0 );
3106}
3107
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003108static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003109{
Paul Bakker23986e52011-04-24 08:57:21 +00003110 int ret;
3111 size_t i, n;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003112 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3113 ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003114
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003115 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003116
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003117#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
3118 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003119 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003120 /*
3121 * DHM key exchange -- send G^X mod P
3122 */
Paul Bakker48916f92012-09-16 19:57:18 +00003123 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00003124
3125 ssl->out_msg[4] = (unsigned char)( n >> 8 );
3126 ssl->out_msg[5] = (unsigned char)( n );
3127 i = 6;
3128
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003129 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
Hanno Becker8cf6b492017-05-08 11:06:19 +01003130 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
3131 &ssl->out_msg[i], n,
3132 ssl->conf->f_rng, ssl->conf->p_rng );
Paul Bakker5121ce52009-01-03 21:22:43 +00003133 if( ret != 0 )
3134 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003135 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003136 return( ret );
3137 }
3138
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003139 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
3140 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00003141
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003142 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
Hanno Becker8cf6b492017-05-08 11:06:19 +01003143 ssl->handshake->premaster,
3144 MBEDTLS_PREMASTER_SIZE,
3145 &ssl->handshake->pmslen,
3146 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003147 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003148 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003149 return( ret );
3150 }
3151
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003152 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00003153 }
3154 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003155#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
3156#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3157 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3158 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3159 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
3160 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3161 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3162 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
3163 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01003164 {
3165 /*
3166 * ECDH key exchange -- send client public value
3167 */
3168 i = 4;
3169
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003170 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,
Paul Bakker41c83d32013-03-20 14:39:14 +01003171 &n,
3172 &ssl->out_msg[i], 1000,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003173 ssl->conf->f_rng, ssl->conf->p_rng );
Paul Bakker41c83d32013-03-20 14:39:14 +01003174 if( ret != 0 )
3175 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003176 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01003177 return( ret );
3178 }
3179
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003180 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
Paul Bakker41c83d32013-03-20 14:39:14 +01003181
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003182 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
Hanno Becker8cf6b492017-05-08 11:06:19 +01003183 &ssl->handshake->pmslen,
3184 ssl->handshake->premaster,
3185 MBEDTLS_MPI_MAX_SIZE,
3186 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003187 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003188 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01003189 return( ret );
3190 }
3191
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003192 MBEDTLS_SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
Paul Bakker41c83d32013-03-20 14:39:14 +01003193 }
3194 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003195#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3196 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3197 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3198 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3199#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Hanno Becker1aa267c2017-04-28 17:08:27 +01003200 if( mbedtls_ssl_ciphersuite_uses_psk( ciphersuite_info ) )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003201 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003202 /*
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003203 * opaque psk_identity<0..2^16-1>;
3204 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003205 if( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL )
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003206 {
3207 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for PSK" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003208 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003209 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003210
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003211 i = 4;
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003212 n = ssl->conf->psk_identity_len;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003213
3214 if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )
3215 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01003216 MBEDTLS_SSL_DEBUG_MSG( 1,
3217 ( "psk identity too long or SSL buffer too short" ) );
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003218 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3219 }
3220
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003221 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
3222 ssl->out_msg[i++] = (unsigned char)( n );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003223
Hanno Becker8cf6b492017-05-08 11:06:19 +01003224 memcpy( ssl->out_msg + i,
3225 ssl->conf->psk_identity,
3226 ssl->conf->psk_identity_len );
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003227 i += ssl->conf->psk_identity_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003228
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003229#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
3230 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003231 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003232 n = 0;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003233 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003234 else
3235#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003236#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
3237 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003238 {
3239 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 2 ) ) != 0 )
3240 return( ret );
3241 }
3242 else
3243#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003244#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3245 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003246 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003247 /*
3248 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
3249 */
3250 n = ssl->handshake->dhm_ctx.len;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003251
3252 if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )
3253 {
Hanno Becker8cf6b492017-05-08 11:06:19 +01003254 MBEDTLS_SSL_DEBUG_MSG( 1,
3255 ( "psk identity or DHM size too long or SSL buffer too short" ) );
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003256 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3257 }
3258
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003259 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
3260 ssl->out_msg[i++] = (unsigned char)( n );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003262 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
3263 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003264 &ssl->out_msg[i], n,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003265 ssl->conf->f_rng, ssl->conf->p_rng );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003266 if( ret != 0 )
3267 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003268 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003269 return( ret );
3270 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003271 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003272 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003273#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
3274#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
3275 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003276 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003277 /*
3278 * ClientECDiffieHellmanPublic public;
3279 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003280 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n,
3281 &ssl->out_msg[i], MBEDTLS_SSL_MAX_CONTENT_LEN - i,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003282 ssl->conf->f_rng, ssl->conf->p_rng );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003283 if( ret != 0 )
3284 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003285 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003286 return( ret );
3287 }
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003288
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003289 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003290 }
3291 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003292#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003293 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003294 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3295 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003296 }
3297
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003298 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003299 ciphersuite_info->key_exchange ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003300 {
Ronald Cron904775d2020-06-11 09:34:06 +02003301 MBEDTLS_SSL_DEBUG_RET( 1,
3302 "mbedtls_ssl_psk_derive_premaster", ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003303 return( ret );
3304 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003305 }
3306 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003307#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
3308#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
3309 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003310 {
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003311 i = 4;
3312 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 0 ) ) != 0 )
Paul Bakkera3d195c2011-11-27 21:07:34 +00003313 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003314 }
Paul Bakkered27a042013-04-18 22:46:23 +02003315 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003316#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003317#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
3318 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
3319 {
3320 i = 4;
3321
3322 ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
3323 ssl->out_msg + i, MBEDTLS_SSL_MAX_CONTENT_LEN - i, &n,
3324 ssl->conf->f_rng, ssl->conf->p_rng );
3325 if( ret != 0 )
3326 {
3327 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
3328 return( ret );
3329 }
3330
3331 ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
3332 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
3333 ssl->conf->f_rng, ssl->conf->p_rng );
3334 if( ret != 0 )
3335 {
3336 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
3337 return( ret );
3338 }
3339 }
3340 else
3341#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02003342 {
3343 ((void) ciphersuite_info);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003344 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3345 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakkered27a042013-04-18 22:46:23 +02003346 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003347
Paul Bakker5121ce52009-01-03 21:22:43 +00003348 ssl->out_msglen = i + n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003349 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3350 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003351
3352 ssl->state++;
3353
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003354 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003355 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003356 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003357 return( ret );
3358 }
3359
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003360 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003361
3362 return( 0 );
3363}
3364
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003365#if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
3366 !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
Paul Bakker29f221f2016-07-22 13:49:02 +01003367 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003368 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
Paul Bakker29f221f2016-07-22 13:49:02 +01003369 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003370 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
3371static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003372{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003373 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3374 ssl->transform_negotiate->ciphersuite_info;
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003375 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003376
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003377 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003378
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003379 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003380 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003381 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003382 return( ret );
3383 }
3384
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003385 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
3386 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3387 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
Manuel Pégourié-Gonnard25dbeb02015-09-16 17:30:03 +02003388 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
3389 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Paul Bakkered27a042013-04-18 22:46:23 +02003390 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003391 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakkered27a042013-04-18 22:46:23 +02003392 ssl->state++;
3393 return( 0 );
3394 }
3395
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003396 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3397 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003398}
3399#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003400static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003401{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003402 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003403 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3404 ssl->transform_negotiate->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003405 size_t n = 0, offset = 0;
3406 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003407 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003408 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02003409 unsigned int hashlen;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003410
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003411 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003413 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003414 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003415 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003416 return( ret );
3417 }
3418
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003419 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
3420 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3421 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
Manuel Pégourié-Gonnard25dbeb02015-09-16 17:30:03 +02003422 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
3423 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003424 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003425 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003426 ssl->state++;
3427 return( 0 );
3428 }
3429
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003430 if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003431 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003432 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003433 ssl->state++;
3434 return( 0 );
3435 }
3436
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003437 if( mbedtls_ssl_own_key( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003438 {
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003439 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for certificate" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003440 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003441 }
3442
3443 /*
3444 * Make an RSA signature of the handshake digests
3445 */
Paul Bakker48916f92012-09-16 19:57:18 +00003446 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00003447
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003448#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3449 defined(MBEDTLS_SSL_PROTO_TLS1_1)
3450 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003451 {
Paul Bakker926af752012-11-23 13:38:07 +01003452 /*
3453 * digitally-signed struct {
3454 * opaque md5_hash[16];
3455 * opaque sha_hash[20];
3456 * };
3457 *
3458 * md5_hash
3459 * MD5(handshake_messages);
3460 *
3461 * sha_hash
3462 * SHA(handshake_messages);
3463 */
3464 hashlen = 36;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003465 md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003466
3467 /*
3468 * For ECDSA, default hash is SHA-1 only
3469 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003470 if( mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003471 {
3472 hash_start += 16;
3473 hashlen -= 16;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003474 md_alg = MBEDTLS_MD_SHA1;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003475 }
Paul Bakker926af752012-11-23 13:38:07 +01003476 }
3477 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003478#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
3479 MBEDTLS_SSL_PROTO_TLS1_1 */
3480#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3481 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01003482 {
3483 /*
3484 * digitally-signed struct {
3485 * opaque handshake_messages[handshake_messages_length];
3486 * };
3487 *
3488 * Taking shortcut here. We assume that the server always allows the
3489 * PRF Hash function and has sent it in the allowed signature
3490 * algorithms list received in the Certificate Request message.
3491 *
3492 * Until we encounter a server that does not, we will take this
3493 * shortcut.
3494 *
Hanno Becker8cf6b492017-05-08 11:06:19 +01003495 * Reason: Otherwise we should have running hashes for SHA512 and
3496 * SHA224 in order to satisfy 'weird' needs from the server
3497 * side.
Paul Bakker926af752012-11-23 13:38:07 +01003498 */
Paul Bakkerb7149bc2013-03-20 15:30:09 +01003499 if( ssl->transform_negotiate->ciphersuite_info->mac ==
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003500 MBEDTLS_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00003501 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003502 md_alg = MBEDTLS_MD_SHA384;
3503 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00003504 }
3505 else
3506 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003507 md_alg = MBEDTLS_MD_SHA256;
3508 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00003509 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003510 ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003511
Manuel Pégourié-Gonnardbfe32ef2013-08-22 14:55:30 +02003512 /* Info from md_alg will be used instead */
3513 hashlen = 0;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003514 offset = 2;
3515 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003516 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003517#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02003518 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003519 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3520 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02003521 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003522
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003523 if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ), md_alg, hash_start, hashlen,
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003524 ssl->out_msg + 6 + offset, &n,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003525 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02003526 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003527 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003528 return( ret );
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02003529 }
Paul Bakker926af752012-11-23 13:38:07 +01003530
Paul Bakker1ef83d62012-04-11 12:09:53 +00003531 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
3532 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003533
Paul Bakker1ef83d62012-04-11 12:09:53 +00003534 ssl->out_msglen = 6 + n + offset;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003535 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3536 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00003537
3538 ssl->state++;
3539
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003540 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003541 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003542 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003543 return( ret );
3544 }
3545
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003546 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003547
Paul Bakkered27a042013-04-18 22:46:23 +02003548 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003549}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003550#endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
3551 !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
Paul Bakker29f221f2016-07-22 13:49:02 +01003552 !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED &&
3553 !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
3554 !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED &&
3555 !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003556
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003557#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3558static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003559{
3560 int ret;
3561 uint32_t lifetime;
3562 size_t ticket_len;
3563 unsigned char *ticket;
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003564 const unsigned char *msg;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003565
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003566 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003567
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003568 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003569 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003570 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003571 return( ret );
3572 }
3573
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003574 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003575 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003576 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Hanno Becker8cf6b492017-05-08 11:06:19 +01003577 mbedtls_ssl_send_alert_message(
3578 ssl,
3579 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3580 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003581 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003582 }
3583
3584 /*
3585 * struct {
3586 * uint32 ticket_lifetime_hint;
3587 * opaque ticket<0..2^16-1>;
3588 * } NewSessionTicket;
3589 *
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003590 * 0 . 3 ticket_lifetime_hint
3591 * 4 . 5 ticket_len (n)
3592 * 6 . 5+n ticket content
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003593 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003594 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET ||
3595 ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003596 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003597 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003598 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3599 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003600 return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003601 }
3602
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003603 msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003604
Philippe Antoine84cc74e2018-05-11 11:06:29 +02003605 lifetime = ( ((uint32_t) msg[0]) << 24 ) | ( msg[1] << 16 ) |
3606 ( msg[2] << 8 ) | ( msg[3] );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003607
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003608 ticket_len = ( msg[4] << 8 ) | ( msg[5] );
3609
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003610 if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003611 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003612 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003613 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3614 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003615 return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003616 }
3617
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003618 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003619
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02003620 /* We're not waiting for a NewSessionTicket message any more */
3621 ssl->handshake->new_session_ticket = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003622 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02003623
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003624 /*
3625 * Zero-length ticket means the server changed his mind and doesn't want
3626 * to send a ticket after all, so just forget it
3627 */
Paul Bakker66d5d072014-06-17 16:39:18 +02003628 if( ticket_len == 0 )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003629 return( 0 );
3630
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003631 mbedtls_zeroize( ssl->session_negotiate->ticket,
Paul Bakker34617722014-06-13 17:20:13 +02003632 ssl->session_negotiate->ticket_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003633 mbedtls_free( ssl->session_negotiate->ticket );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003634 ssl->session_negotiate->ticket = NULL;
3635 ssl->session_negotiate->ticket_len = 0;
3636
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02003637 if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003638 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02003639 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003640 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3641 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02003642 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003643 }
3644
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003645 memcpy( ticket, msg + 6, ticket_len );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003646
3647 ssl->session_negotiate->ticket = ticket;
3648 ssl->session_negotiate->ticket_len = ticket_len;
3649 ssl->session_negotiate->ticket_lifetime = lifetime;
3650
3651 /*
3652 * RFC 5077 section 3.4:
3653 * "If the client receives a session ticket from the server, then it
3654 * discards any Session ID that was sent in the ServerHello."
3655 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003656 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02003657 ssl->session_negotiate->id_len = 0;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003658
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003659 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003660
3661 return( 0 );
3662}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003663#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003664
Paul Bakker5121ce52009-01-03 21:22:43 +00003665/*
Paul Bakker1961b702013-01-25 14:49:24 +01003666 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00003667 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003668int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003669{
3670 int ret = 0;
3671
Manuel Pégourié-Gonnarddba460f2015-06-24 22:59:30 +02003672 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003673 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003674
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003675 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
Paul Bakker1961b702013-01-25 14:49:24 +01003676
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003677 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
Paul Bakker1961b702013-01-25 14:49:24 +01003678 return( ret );
3679
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003680#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003681 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003682 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003683 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003684 if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003685 return( ret );
3686 }
3687#endif
3688
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003689 /* Change state now, so that it is right in mbedtls_ssl_read_record(), used
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003690 * by DTLS for dropping out-of-sequence ChangeCipherSpec records */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003691#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3692 if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003693 ssl->handshake->new_session_ticket != 0 )
3694 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003695 ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003696 }
3697#endif
3698
Paul Bakker1961b702013-01-25 14:49:24 +01003699 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00003700 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003701 case MBEDTLS_SSL_HELLO_REQUEST:
3702 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00003703 break;
3704
Paul Bakker1961b702013-01-25 14:49:24 +01003705 /*
3706 * ==> ClientHello
3707 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003708 case MBEDTLS_SSL_CLIENT_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01003709 ret = ssl_write_client_hello( ssl );
3710 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003711
Paul Bakker1961b702013-01-25 14:49:24 +01003712 /*
3713 * <== ServerHello
3714 * Certificate
3715 * ( ServerKeyExchange )
3716 * ( CertificateRequest )
3717 * ServerHelloDone
3718 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003719 case MBEDTLS_SSL_SERVER_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01003720 ret = ssl_parse_server_hello( ssl );
3721 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003722
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003723 case MBEDTLS_SSL_SERVER_CERTIFICATE:
3724 ret = mbedtls_ssl_parse_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003725 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003726
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003727 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01003728 ret = ssl_parse_server_key_exchange( ssl );
3729 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003730
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003731 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Paul Bakker1961b702013-01-25 14:49:24 +01003732 ret = ssl_parse_certificate_request( ssl );
3733 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003734
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003735 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Paul Bakker1961b702013-01-25 14:49:24 +01003736 ret = ssl_parse_server_hello_done( ssl );
3737 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003738
Paul Bakker1961b702013-01-25 14:49:24 +01003739 /*
3740 * ==> ( Certificate/Alert )
3741 * ClientKeyExchange
3742 * ( CertificateVerify )
3743 * ChangeCipherSpec
3744 * Finished
3745 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003746 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
3747 ret = mbedtls_ssl_write_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003748 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003749
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003750 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01003751 ret = ssl_write_client_key_exchange( ssl );
3752 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003753
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003754 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Paul Bakker1961b702013-01-25 14:49:24 +01003755 ret = ssl_write_certificate_verify( ssl );
3756 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003757
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003758 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
3759 ret = mbedtls_ssl_write_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003760 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003761
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003762 case MBEDTLS_SSL_CLIENT_FINISHED:
3763 ret = mbedtls_ssl_write_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003764 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003765
Paul Bakker1961b702013-01-25 14:49:24 +01003766 /*
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003767 * <== ( NewSessionTicket )
3768 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01003769 * Finished
3770 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003771#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3772 case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003773 ret = ssl_parse_new_session_ticket( ssl );
3774 break;
Paul Bakkera503a632013-08-14 13:48:06 +02003775#endif
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003776
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003777 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
3778 ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003779 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003780
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003781 case MBEDTLS_SSL_SERVER_FINISHED:
3782 ret = mbedtls_ssl_parse_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003783 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003784
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003785 case MBEDTLS_SSL_FLUSH_BUFFERS:
3786 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
3787 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01003788 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003789
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003790 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
3791 mbedtls_ssl_handshake_wrapup( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003792 break;
Paul Bakker48916f92012-09-16 19:57:18 +00003793
Paul Bakker1961b702013-01-25 14:49:24 +01003794 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003795 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
3796 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker1961b702013-01-25 14:49:24 +01003797 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003798
3799 return( ret );
3800}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003801#endif /* MBEDTLS_SSL_CLI_C */