blob: c7a18f58b5977b4ecbe1d85c913119f60cea36e4 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 client-side functions
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000020 */
21
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020022#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000023#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020024#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020025#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020026#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if defined(MBEDTLS_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020030#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000031#include "mbedtls/platform.h"
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020032#else
Rich Evans00ab4702015-02-06 13:43:58 +000033#include <stdlib.h>
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +020034#define mbedtls_calloc calloc
SimonBd5800b72016-04-26 07:43:27 +010035#define mbedtls_free free
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020036#endif
37
SimonBd5800b72016-04-26 07:43:27 +010038#include "mbedtls/debug.h"
39#include "mbedtls/ssl.h"
40#include "mbedtls/ssl_internal.h"
41
42#include <string.h>
43
Manuel Pégourié-Gonnard93866642015-06-22 19:21:23 +020044#include <stdint.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020045
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010047#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020048#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000049
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050051#include "mbedtls/platform_util.h"
Paul Bakker34617722014-06-13 17:20:13 +020052#endif
53
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
55static void ssl_write_hostname_ext( mbedtls_ssl_context *ssl,
Paul Bakkerd3edc862013-03-20 16:07:17 +010056 unsigned char *buf,
57 size_t *olen )
58{
59 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +100060 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +010061 size_t hostname_len;
Paul Bakkerd3edc862013-03-20 16:07:17 +010062
63 *olen = 0;
64
Paul Bakker66d5d072014-06-17 16:39:18 +020065 if( ssl->hostname == NULL )
Paul Bakkerd3edc862013-03-20 16:07:17 +010066 return;
67
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020068 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
Paul Bakkerd3edc862013-03-20 16:07:17 +010069 ssl->hostname ) );
70
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +010071 hostname_len = strlen( ssl->hostname );
72
Simon Butcher0fc94e92015-09-28 20:52:04 +010073 if( end < p || (size_t)( end - p ) < hostname_len + 9 )
Simon Butchered997662015-09-28 02:14:30 +010074 {
Simon Butcher0fc94e92015-09-28 20:52:04 +010075 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
Simon Butchered997662015-09-28 02:14:30 +010076 return;
77 }
78
Paul Bakkerd3edc862013-03-20 16:07:17 +010079 /*
Hanno Becker1a9a51c2017-04-07 13:02:16 +010080 * Sect. 3, RFC 6066 (TLS Extensions Definitions)
81 *
82 * In order to provide any of the server names, clients MAY include an
83 * extension of type "server_name" in the (extended) client hello. The
84 * "extension_data" field of this extension SHALL contain
85 * "ServerNameList" where:
86 *
Paul Bakkerd3edc862013-03-20 16:07:17 +010087 * struct {
88 * NameType name_type;
89 * select (name_type) {
90 * case host_name: HostName;
91 * } name;
92 * } ServerName;
93 *
94 * enum {
95 * host_name(0), (255)
96 * } NameType;
97 *
98 * opaque HostName<1..2^16-1>;
99 *
100 * struct {
101 * ServerName server_name_list<1..2^16-1>
102 * } ServerNameList;
Hanno Becker1a9a51c2017-04-07 13:02:16 +0100103 *
Paul Bakkerd3edc862013-03-20 16:07:17 +0100104 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200105 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
106 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100107
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100108 *p++ = (unsigned char)( ( (hostname_len + 5) >> 8 ) & 0xFF );
109 *p++ = (unsigned char)( ( (hostname_len + 5) ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100110
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100111 *p++ = (unsigned char)( ( (hostname_len + 3) >> 8 ) & 0xFF );
112 *p++ = (unsigned char)( ( (hostname_len + 3) ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200114 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100115 *p++ = (unsigned char)( ( hostname_len >> 8 ) & 0xFF );
116 *p++ = (unsigned char)( ( hostname_len ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100117
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100118 memcpy( p, ssl->hostname, hostname_len );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100119
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +0100120 *olen = hostname_len + 9;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100121}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200122#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100123
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200124#if defined(MBEDTLS_SSL_RENEGOTIATION)
125static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,
Paul Bakkerd3edc862013-03-20 16:07:17 +0100126 unsigned char *buf,
127 size_t *olen )
128{
129 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000130 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100131
132 *olen = 0;
133
Hanno Becker40f8b512017-10-12 14:58:55 +0100134 /* We're always including an TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the
135 * initial ClientHello, in which case also adding the renegotiation
136 * info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200137 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Paul Bakkerd3edc862013-03-20 16:07:17 +0100138 return;
139
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200140 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100141
Simon Butcher0fc94e92015-09-28 20:52:04 +0100142 if( end < p || (size_t)( end - p ) < 5 + ssl->verify_data_len )
Simon Butchered997662015-09-28 02:14:30 +0100143 {
144 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
145 return;
146 }
147
Paul Bakkerd3edc862013-03-20 16:07:17 +0100148 /*
149 * Secure renegotiation
150 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
152 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100153
154 *p++ = 0x00;
155 *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
156 *p++ = ssl->verify_data_len & 0xFF;
157
158 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
159
160 *olen = 5 + ssl->verify_data_len;
161}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200162#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100163
Manuel Pégourié-Gonnardd9423232014-12-02 11:57:29 +0100164/*
165 * Only if we handle at least one key exchange that needs signatures.
166 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200167#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
168 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
169static void ssl_write_signature_algorithms_ext( mbedtls_ssl_context *ssl,
Paul Bakkerd3edc862013-03-20 16:07:17 +0100170 unsigned char *buf,
171 size_t *olen )
172{
173 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000174 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100175 size_t sig_alg_len = 0;
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200176 const int *md;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200177#if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5bfd9682014-06-24 15:18:11 +0200178 unsigned char *sig_alg_list = buf + 6;
179#endif
Paul Bakkerd3edc862013-03-20 16:07:17 +0100180
181 *olen = 0;
182
Hanno Beckere965bd32019-06-12 14:04:34 +0100183 if( mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) !=
184 MBEDTLS_SSL_MINOR_VERSION_3 )
185 {
Paul Bakkerd3edc862013-03-20 16:07:17 +0100186 return;
Hanno Beckere965bd32019-06-12 14:04:34 +0100187 }
Paul Bakkerd3edc862013-03-20 16:07:17 +0100188
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200189 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100190
Simon Butchered997662015-09-28 02:14:30 +0100191 for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
192 {
193#if defined(MBEDTLS_ECDSA_C)
194 sig_alg_len += 2;
195#endif
196#if defined(MBEDTLS_RSA_C)
197 sig_alg_len += 2;
198#endif
199 }
200
Simon Butcher0fc94e92015-09-28 20:52:04 +0100201 if( end < p || (size_t)( end - p ) < sig_alg_len + 6 )
Simon Butchered997662015-09-28 02:14:30 +0100202 {
203 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
204 return;
205 }
206
Paul Bakkerd3edc862013-03-20 16:07:17 +0100207 /*
208 * Prepare signature_algorithms extension (TLS 1.2)
209 */
Simon Butchered997662015-09-28 02:14:30 +0100210 sig_alg_len = 0;
211
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200212 for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
213 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200214#if defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200215 sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
216 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA;
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200217#endif
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200218#if defined(MBEDTLS_RSA_C)
219 sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
220 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA;
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200221#endif
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200222 }
Paul Bakkerd3edc862013-03-20 16:07:17 +0100223
224 /*
225 * enum {
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200226 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
227 * sha512(6), (255)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100228 * } HashAlgorithm;
229 *
230 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
231 * SignatureAlgorithm;
232 *
233 * struct {
234 * HashAlgorithm hash;
235 * SignatureAlgorithm signature;
236 * } SignatureAndHashAlgorithm;
237 *
238 * SignatureAndHashAlgorithm
239 * supported_signature_algorithms<2..2^16-2>;
240 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200241 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
242 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100243
244 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
245 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
246
247 *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
248 *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
249
Paul Bakkerd3edc862013-03-20 16:07:17 +0100250 *olen = 6 + sig_alg_len;
251}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200252#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
253 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100254
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +0200255#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100256 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200257static void ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,
Paul Bakkerd3edc862013-03-20 16:07:17 +0100258 unsigned char *buf,
259 size_t *olen )
260{
261 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000262 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard8e205fc2014-01-23 17:27:10 +0100263 unsigned char *elliptic_curve_list = p + 6;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100264 size_t elliptic_curve_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200265 const mbedtls_ecp_curve_info *info;
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +0200266#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200267 const mbedtls_ecp_group_id *grp_id;
Paul Bakker0910f322014-02-06 13:41:18 +0100268#else
269 ((void) ssl);
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100270#endif
Paul Bakkerd3edc862013-03-20 16:07:17 +0100271
272 *olen = 0;
273
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200274 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100275
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +0200276#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200277 for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100278#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200279 for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )
Gilles Peskinef9828522017-05-03 12:28:43 +0200280#endif
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100281 {
Gilles Peskinef9828522017-05-03 12:28:43 +0200282#if defined(MBEDTLS_ECP_C)
283 info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100284#endif
Janos Follath8a317052016-04-21 23:37:09 +0100285 if( info == NULL )
286 {
287 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid curve in ssl configuration" ) );
288 return;
289 }
290
Simon Butchered997662015-09-28 02:14:30 +0100291 elliptic_curve_len += 2;
292 }
293
Simon Butcher0fc94e92015-09-28 20:52:04 +0100294 if( end < p || (size_t)( end - p ) < 6 + elliptic_curve_len )
Simon Butchered997662015-09-28 02:14:30 +0100295 {
296 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
297 return;
298 }
299
300 elliptic_curve_len = 0;
301
302#if defined(MBEDTLS_ECP_C)
303 for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )
Simon Butchered997662015-09-28 02:14:30 +0100304#else
305 for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )
Gilles Peskinef9828522017-05-03 12:28:43 +0200306#endif
Simon Butchered997662015-09-28 02:14:30 +0100307 {
Gilles Peskinef9828522017-05-03 12:28:43 +0200308#if defined(MBEDTLS_ECP_C)
309 info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
Simon Butchered997662015-09-28 02:14:30 +0100310#endif
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100311 elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8;
312 elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF;
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200313 }
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200314
315 if( elliptic_curve_len == 0 )
316 return;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200318 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
319 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100320
321 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
322 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
323
324 *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
325 *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
326
Paul Bakkerd3edc862013-03-20 16:07:17 +0100327 *olen = 6 + elliptic_curve_len;
328}
329
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200330static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
Paul Bakkerd3edc862013-03-20 16:07:17 +0100331 unsigned char *buf,
332 size_t *olen )
333{
334 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000335 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100336
337 *olen = 0;
338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100340
Simon Butcher0fc94e92015-09-28 20:52:04 +0100341 if( end < p || (size_t)( end - p ) < 6 )
Simon Butchered997662015-09-28 02:14:30 +0100342 {
343 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
344 return;
345 }
346
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200347 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
348 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100349
350 *p++ = 0x00;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100351 *p++ = 2;
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200352
353 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200354 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100355
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200356 *olen = 6;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100357}
Darryl Green11999bb2018-03-13 15:22:58 +0000358#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
Robert Cragieae8535d2015-10-06 17:11:18 +0100359 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100360
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200361#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200362static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
363 unsigned char *buf,
364 size_t *olen )
365{
366 int ret;
367 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000368 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200369 size_t kkpp_len;
370
371 *olen = 0;
372
373 /* Skip costly extension if we can't use EC J-PAKE anyway */
374 if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
375 return;
376
377 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding ecjpake_kkpp extension" ) );
378
379 if( end - p < 4 )
380 {
381 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
382 return;
383 }
384
385 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
386 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
387
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200388 /*
389 * We may need to send ClientHello multiple times for Hello verification.
390 * We don't want to compute fresh values every time (both for performance
391 * and consistency reasons), so cache the extension content.
392 */
393 if( ssl->handshake->ecjpake_cache == NULL ||
394 ssl->handshake->ecjpake_cache_len == 0 )
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200395 {
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200396 MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) );
397
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +0200398 ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
399 p + 2, end - p - 2, &kkpp_len,
Hanno Beckerece325c2019-06-13 15:39:27 +0100400 mbedtls_ssl_conf_get_frng( ssl->conf ),
401 ssl->conf->p_rng );
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +0200402 if( ret != 0 )
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200403 {
404 MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret );
405 return;
406 }
407
408 ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len );
409 if( ssl->handshake->ecjpake_cache == NULL )
410 {
411 MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) );
412 return;
413 }
414
415 memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len );
416 ssl->handshake->ecjpake_cache_len = kkpp_len;
417 }
418 else
419 {
420 MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) );
421
422 kkpp_len = ssl->handshake->ecjpake_cache_len;
423
424 if( (size_t)( end - p - 2 ) < kkpp_len )
425 {
426 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
427 return;
428 }
429
430 memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200431 }
432
433 *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
434 *p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
435
436 *olen = kkpp_len + 4;
437}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200438#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000439
Hanno Beckera5a2b082019-05-15 14:03:01 +0100440#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker39ec5252019-04-25 16:55:15 +0100441static void ssl_write_cid_ext( mbedtls_ssl_context *ssl,
442 unsigned char *buf,
443 size_t *olen )
444{
445 unsigned char *p = buf;
446 size_t ext_len;
447 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
448
449 /*
Hanno Becker3cdf8fe2019-05-15 10:26:32 +0100450 * Quoting draft-ietf-tls-dtls-connection-id-05
451 * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
Hanno Becker39ec5252019-04-25 16:55:15 +0100452 *
453 * struct {
454 * opaque cid<0..2^8-1>;
455 * } ConnectionId;
456 */
457
458 *olen = 0;
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +0200459 if( MBEDTLS_SSL_TRANSPORT_IS_TLS( ssl->conf->transport ) ||
Hanno Becker39ec5252019-04-25 16:55:15 +0100460 ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED )
461 {
462 return;
463 }
464 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding CID extension" ) );
465
466 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
467 * which is at most 255, so the increment cannot overflow. */
468 if( end < p || (size_t)( end - p ) < (unsigned)( ssl->own_cid_len + 5 ) )
469 {
470 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
471 return;
472 }
473
474 /* Add extension ID + size */
475 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_CID >> 8 ) & 0xFF );
476 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_CID ) & 0xFF );
477 ext_len = (size_t) ssl->own_cid_len + 1;
478 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
479 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
480
481 *p++ = (uint8_t) ssl->own_cid_len;
482 memcpy( p, ssl->own_cid, ssl->own_cid_len );
483
484 *olen = ssl->own_cid_len + 5;
485}
Hanno Beckera5a2b082019-05-15 14:03:01 +0100486#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker39ec5252019-04-25 16:55:15 +0100487
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200488#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
489static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200490 unsigned char *buf,
491 size_t *olen )
492{
493 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000494 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200495
Simon Butcher0fc94e92015-09-28 20:52:04 +0100496 *olen = 0;
497
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200498 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) {
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200499 return;
500 }
501
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200502 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200503
Simon Butcher0fc94e92015-09-28 20:52:04 +0100504 if( end < p || (size_t)( end - p ) < 5 )
Simon Butchered997662015-09-28 02:14:30 +0100505 {
506 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
507 return;
508 }
509
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200510 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
511 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200512
513 *p++ = 0x00;
514 *p++ = 1;
515
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200516 *p++ = ssl->conf->mfl_code;
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200517
518 *olen = 5;
519}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200520#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200521
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200522#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
523static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200524 unsigned char *buf, size_t *olen )
525{
526 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000527 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200528
Simon Butcher0fc94e92015-09-28 20:52:04 +0100529 *olen = 0;
530
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200531 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200532 {
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200533 return;
534 }
535
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200536 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200537
Simon Butcher0fc94e92015-09-28 20:52:04 +0100538 if( end < p || (size_t)( end - p ) < 4 )
Simon Butchered997662015-09-28 02:14:30 +0100539 {
540 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
541 return;
542 }
543
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200544 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
545 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200546
547 *p++ = 0x00;
548 *p++ = 0x00;
549
550 *olen = 4;
551}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200552#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200553
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200554#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
555static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100556 unsigned char *buf, size_t *olen )
557{
558 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000559 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100560
Simon Butcher0fc94e92015-09-28 20:52:04 +0100561 *olen = 0;
562
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200563 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
Hanno Beckere965bd32019-06-12 14:04:34 +0100564 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ==
565 MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100566 {
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100567 return;
568 }
569
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding encrypt_then_mac "
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100571 "extension" ) );
572
Simon Butcher0fc94e92015-09-28 20:52:04 +0100573 if( end < p || (size_t)( end - p ) < 4 )
Simon Butchered997662015-09-28 02:14:30 +0100574 {
575 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
576 return;
577 }
578
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200579 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
580 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100581
582 *p++ = 0x00;
583 *p++ = 0x00;
584
585 *olen = 4;
586}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200587#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100588
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200589#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
590static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200591 unsigned char *buf, size_t *olen )
592{
593 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000594 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200595
Simon Butcher0fc94e92015-09-28 20:52:04 +0100596 *olen = 0;
597
Hanno Beckeraabbb582019-06-11 13:43:27 +0100598 if( mbedtls_ssl_conf_get_ems( ssl->conf ) ==
599 MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
Hanno Beckere965bd32019-06-12 14:04:34 +0100600 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ==
601 MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200602 {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200603 return;
604 }
605
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200606 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding extended_master_secret "
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200607 "extension" ) );
608
Simon Butcher0fc94e92015-09-28 20:52:04 +0100609 if( end < p || (size_t)( end - p ) < 4 )
Simon Butchered997662015-09-28 02:14:30 +0100610 {
611 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
612 return;
613 }
614
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200615 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );
616 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200617
618 *p++ = 0x00;
619 *p++ = 0x00;
620
621 *olen = 4;
622}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200623#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200624
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200625#if defined(MBEDTLS_SSL_SESSION_TICKETS)
626static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200627 unsigned char *buf, size_t *olen )
628{
629 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000630 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200631 size_t tlen = ssl->session_negotiate->ticket_len;
632
Simon Butcher0fc94e92015-09-28 20:52:04 +0100633 *olen = 0;
634
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200635 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED )
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200636 {
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200637 return;
638 }
639
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200640 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200641
Simon Butcher0fc94e92015-09-28 20:52:04 +0100642 if( end < p || (size_t)( end - p ) < 4 + tlen )
Simon Butchered997662015-09-28 02:14:30 +0100643 {
644 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
645 return;
646 }
647
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200648 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
649 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200650
651 *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
652 *p++ = (unsigned char)( ( tlen ) & 0xFF );
653
654 *olen = 4;
655
Simon Butchered997662015-09-28 02:14:30 +0100656 if( ssl->session_negotiate->ticket == NULL || tlen == 0 )
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200657 {
658 return;
659 }
660
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200661 MBEDTLS_SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200662
663 memcpy( p, ssl->session_negotiate->ticket, tlen );
664
665 *olen += tlen;
666}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200667#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200668
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200669#if defined(MBEDTLS_SSL_ALPN)
670static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200671 unsigned char *buf, size_t *olen )
672{
673 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000674 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Simon Butchered997662015-09-28 02:14:30 +0100675 size_t alpnlen = 0;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200676 const char **cur;
677
Simon Butcher0fc94e92015-09-28 20:52:04 +0100678 *olen = 0;
679
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200680 if( ssl->conf->alpn_list == NULL )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200681 {
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200682 return;
683 }
684
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200685 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200686
Simon Butchered997662015-09-28 02:14:30 +0100687 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
Simon Butcher04799a42015-09-29 00:31:09 +0100688 alpnlen += (unsigned char)( strlen( *cur ) & 0xFF ) + 1;
Simon Butchered997662015-09-28 02:14:30 +0100689
Simon Butcher0fc94e92015-09-28 20:52:04 +0100690 if( end < p || (size_t)( end - p ) < 6 + alpnlen )
Simon Butchered997662015-09-28 02:14:30 +0100691 {
692 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
693 return;
694 }
695
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200696 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );
697 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200698
699 /*
700 * opaque ProtocolName<1..2^8-1>;
701 *
702 * struct {
703 * ProtocolName protocol_name_list<2..2^16-1>
704 * } ProtocolNameList;
705 */
706
707 /* Skip writing extension and list length for now */
708 p += 4;
709
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200710 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200711 {
712 *p = (unsigned char)( strlen( *cur ) & 0xFF );
713 memcpy( p + 1, *cur, *p );
714 p += 1 + *p;
715 }
716
717 *olen = p - buf;
718
719 /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
720 buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
721 buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF );
722
723 /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */
724 buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
725 buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF );
726}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200727#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200728
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200729/*
730 * Generate random bytes for ClientHello
731 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200732static int ssl_generate_random( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200733{
734 int ret;
735 unsigned char *p = ssl->handshake->randbytes;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200736#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +0100737 mbedtls_time_t t;
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200738#endif
739
Manuel Pégourié-Gonnardfb2d2232014-07-22 15:59:14 +0200740 /*
741 * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1)
742 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200743#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +0200744 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) &&
Manuel Pégourié-Gonnardfb2d2232014-07-22 15:59:14 +0200745 ssl->handshake->verify_cookie != NULL )
746 {
747 return( 0 );
748 }
749#endif
750
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200751#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +0100752 t = mbedtls_time( NULL );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200753 *p++ = (unsigned char)( t >> 24 );
754 *p++ = (unsigned char)( t >> 16 );
755 *p++ = (unsigned char)( t >> 8 );
756 *p++ = (unsigned char)( t );
757
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200758 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200759#else
Hanno Beckerece325c2019-06-13 15:39:27 +0100760 if( ( ret = mbedtls_ssl_conf_get_frng( ssl->conf )
761 ( ssl->conf->p_rng, p, 4 ) ) != 0 )
762 {
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200763 return( ret );
Hanno Beckerece325c2019-06-13 15:39:27 +0100764 }
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200765
766 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200767#endif /* MBEDTLS_HAVE_TIME */
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200768
Hanno Beckerece325c2019-06-13 15:39:27 +0100769 if( ( ret = mbedtls_ssl_conf_get_frng( ssl->conf )
770 ( ssl->conf->p_rng, p, 28 ) ) != 0 )
771 {
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200772 return( ret );
Hanno Beckerece325c2019-06-13 15:39:27 +0100773 }
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200774
775 return( 0 );
776}
777
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100778/**
779 * \brief Validate cipher suite against config in SSL context.
780 *
781 * \param suite_info cipher suite to validate
782 * \param ssl SSL context
Andrzej Kurek03bac442018-04-25 05:06:07 -0400783 * \param min_minor_ver Minimal minor version to accept a cipher suite
784 * \param max_minor_ver Maximal minor version to accept a cipher suite
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100785 *
786 * \return 0 if valid, else 1
787 */
Hanno Becker473f98f2019-06-26 10:27:32 +0100788static int ssl_validate_ciphersuite( mbedtls_ssl_ciphersuite_handle_t suite_info,
Andrzej Kurek03bac442018-04-25 05:06:07 -0400789 const mbedtls_ssl_context * ssl,
790 int min_minor_ver, int max_minor_ver )
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100791{
Andrzej Kurek03bac442018-04-25 05:06:07 -0400792 (void) ssl;
Hanno Becker473f98f2019-06-26 10:27:32 +0100793 if( suite_info == MBEDTLS_SSL_CIPHERSUITE_INVALID_HANDLE )
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100794 return( 1 );
795
Hanno Becker473f98f2019-06-26 10:27:32 +0100796 if( mbedtls_ssl_suite_get_min_minor_ver( suite_info ) > max_minor_ver ||
797 mbedtls_ssl_suite_get_max_minor_ver( suite_info ) < min_minor_ver )
798 {
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100799 return( 1 );
Hanno Becker473f98f2019-06-26 10:27:32 +0100800 }
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100801
802#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +0200803 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) &&
Hanno Becker473f98f2019-06-26 10:27:32 +0100804 ( mbedtls_ssl_suite_get_flags( suite_info ) &
805 MBEDTLS_CIPHERSUITE_NODTLS ) != 0 )
806 {
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100807 return( 1 );
Hanno Becker473f98f2019-06-26 10:27:32 +0100808 }
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100809#endif
810
811#if defined(MBEDTLS_ARC4_C)
812 if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&
Hanno Becker473f98f2019-06-26 10:27:32 +0100813 mbedtls_ssl_suite_get_cipher( suite_info ) == MBEDTLS_CIPHER_ARC4_128 )
814 {
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100815 return( 1 );
Hanno Becker473f98f2019-06-26 10:27:32 +0100816 }
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100817#endif
818
819#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +0100820 if( mbedtls_ssl_suite_get_key_exchange( suite_info ) ==
821 MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
822 mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
823 {
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100824 return( 1 );
Hanno Becker473f98f2019-06-26 10:27:32 +0100825 }
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100826#endif
827
828 return( 0 );
829}
830
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200831static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +0000832{
Paul Bakker23986e52011-04-24 08:57:21 +0000833 int ret;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100834 size_t i, n, olen, ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000835 unsigned char *buf;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200836 unsigned char *p, *q;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +0200837 unsigned char offer_compress;
Ron Eldor755bb6a2018-02-14 19:30:48 +0200838#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
839 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
840 int uses_ec = 0;
841#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000842
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200843 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000844
Hanno Beckerece325c2019-06-13 15:39:27 +0100845 if( mbedtls_ssl_conf_get_frng( ssl->conf ) == NULL )
Paul Bakkera9a028e2013-11-21 17:31:06 +0100846 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200847 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
848 return( MBEDTLS_ERR_SSL_NO_RNG );
Paul Bakkera9a028e2013-11-21 17:31:06 +0100849 }
850
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +0200851 if( mbedtls_ssl_get_renego_status( ssl ) == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +0000852 {
Hanno Becker381eaa52019-06-12 14:43:01 +0100853#if !defined(MBEDTLS_SSL_CONF_FIXED_MAJOR_VER)
Hanno Beckere965bd32019-06-12 14:04:34 +0100854 ssl->major_ver = mbedtls_ssl_conf_get_min_major_ver( ssl->conf );
Hanno Becker381eaa52019-06-12 14:43:01 +0100855#endif /* !MBEDTLS_SSL_CONF_FIXED_MAJOR_VER */
856#if !defined(MBEDTLS_SSL_CONF_FIXED_MINOR_VER)
Hanno Beckere965bd32019-06-12 14:04:34 +0100857 ssl->minor_ver = mbedtls_ssl_conf_get_min_minor_ver( ssl->conf );
Hanno Becker381eaa52019-06-12 14:43:01 +0100858#endif /* !MBEDTLS_SSL_CONF_FIXED_MINOR_VER */
Paul Bakker48916f92012-09-16 19:57:18 +0000859 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000860
Hanno Beckere965bd32019-06-12 14:04:34 +0100861 if( mbedtls_ssl_conf_get_max_major_ver( ssl->conf ) == 0 )
Paul Bakker490ecc82011-10-06 13:04:09 +0000862 {
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +0200863 MBEDTLS_SSL_DEBUG_MSG( 1, ( "configured max major version is invalid, "
864 "consider using mbedtls_ssl_config_defaults()" ) );
865 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker490ecc82011-10-06 13:04:09 +0000866 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000867
868 /*
869 * 0 . 0 handshake type
870 * 1 . 3 handshake length
871 * 4 . 5 highest version supported
872 * 6 . 9 current UNIX time
873 * 10 . 37 random bytes
874 */
875 buf = ssl->out_msg;
876 p = buf + 4;
877
Hanno Beckere965bd32019-06-12 14:04:34 +0100878 mbedtls_ssl_write_version( mbedtls_ssl_conf_get_max_major_ver( ssl->conf ),
879 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ),
880 ssl->conf->transport, p );
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100881 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000882
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200883 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
Paul Bakker5121ce52009-01-03 21:22:43 +0000884 buf[4], buf[5] ) );
885
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200886 if( ( ret = ssl_generate_random( ssl ) ) != 0 )
887 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200888 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200889 return( ret );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200890 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200891
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200892 memcpy( p, ssl->handshake->randbytes, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200893 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", p, 32 );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200894 p += 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000895
896 /*
897 * 38 . 38 session id length
898 * 39 . 39+n session id
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100899 * 39+n . 39+n DTLS only: cookie length (1 byte)
900 * 40+n . .. DTSL only: cookie
901 * .. . .. ciphersuitelist length (2 bytes)
902 * .. . .. ciphersuitelist
903 * .. . .. compression methods length (1 byte)
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000904 * .. . .. compression methods
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100905 * .. . .. extensions length (2 bytes)
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000906 * .. . .. extensions
Paul Bakker5121ce52009-01-03 21:22:43 +0000907 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000908
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +0200909 /*
910 * We'll write a session of non-zero length if resumption was requested
911 * by the user, we're not renegotiating, and the session ID is of
912 * appropriate length. Otherwise make the length 0 (for now, see next code
913 * block for behaviour with tickets).
914 */
915 if( mbedtls_ssl_handshake_get_resume( ssl->handshake ) == 0 ||
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +0200916 mbedtls_ssl_get_renego_status( ssl ) != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +0200917 ssl->session_negotiate->id_len < 16 ||
918 ssl->session_negotiate->id_len > 32 )
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200919 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000920 n = 0;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200921 }
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +0200922 else
923 {
924 n = ssl->session_negotiate->id_len;
925 }
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200926
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200927#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200928 /*
929 * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
930 * generate and include a Session ID in the TLS ClientHello."
931 */
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +0200932 if( mbedtls_ssl_get_renego_status( ssl ) == MBEDTLS_SSL_INITIAL_HANDSHAKE &&
933 ssl->session_negotiate->ticket != NULL &&
934 ssl->session_negotiate->ticket_len != 0 )
Manuel Pégourié-Gonnardd2b35ec2015-03-10 11:40:43 +0000935 {
Hanno Beckerece325c2019-06-13 15:39:27 +0100936 ret = mbedtls_ssl_conf_get_frng( ssl->conf )
937 ( ssl->conf->p_rng, ssl->session_negotiate->id, 32 );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200938
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +0200939 if( ret != 0 )
940 return( ret );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200941
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +0200942 ssl->session_negotiate->id_len = n = 32;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200943 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200944#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Paul Bakker5121ce52009-01-03 21:22:43 +0000945
946 *p++ = (unsigned char) n;
947
948 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +0000949 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000950
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200951 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
952 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000953
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100954 /*
955 * DTLS cookie
956 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200957#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +0200958 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) )
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100959 {
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200960 if( ssl->handshake->verify_cookie == NULL )
961 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200962 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no verify cookie to send" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200963 *p++ = 0;
964 }
965 else
966 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200967 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200968 ssl->handshake->verify_cookie,
969 ssl->handshake->verify_cookie_len );
970
971 *p++ = ssl->handshake->verify_cookie_len;
972 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é-Gonnard4128aa72014-03-21 09:40:12 +0100982
983 /* Skip writing ciphersuite length for now */
984 n = 0;
985 q = p;
986 p += 2;
987
Hanno Becker14990272019-06-26 11:47:15 +0100988 MBEDTLS_SSL_BEGIN_FOR_EACH_CIPHERSUITE( ssl,
989 ssl->minor_ver,
990 ciphersuite_info )
Paul Bakker5121ce52009-01-03 21:22:43 +0000991 {
Andrzej Kurek03bac442018-04-25 05:06:07 -0400992 if( ssl_validate_ciphersuite( ciphersuite_info, ssl,
Hanno Beckere965bd32019-06-12 14:04:34 +0100993 mbedtls_ssl_conf_get_min_minor_ver( ssl->conf ),
994 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ) != 0 )
Hanno Becker14990272019-06-26 11:47:15 +0100995 {
Hanno Beckerf4d6b492019-07-02 17:13:14 +0100996 continue;
Hanno Becker14990272019-06-26 11:47:15 +0100997 }
Paul Bakker2fbefde2013-06-29 16:01:15 +0200998
Manuel Pégourié-Gonnard60884a12015-09-16 11:13:41 +0200999 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x",
Hanno Becker473f98f2019-06-26 10:27:32 +01001000 mbedtls_ssl_suite_get_id( ciphersuite_info ) ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001001
Ron Eldor755bb6a2018-02-14 19:30:48 +02001002#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
1003 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1004 uses_ec |= mbedtls_ssl_ciphersuite_uses_ec( ciphersuite_info );
1005#endif
1006
Paul Bakker2fbefde2013-06-29 16:01:15 +02001007 n++;
Hanno Becker473f98f2019-06-26 10:27:32 +01001008 *p++ = (unsigned char)(
1009 mbedtls_ssl_suite_get_id( ciphersuite_info ) >> 8 );
1010 *p++ = (unsigned char)(
1011 mbedtls_ssl_suite_get_id( ciphersuite_info ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001012 }
Hanno Becker14990272019-06-26 11:47:15 +01001013 MBEDTLS_SSL_END_FOR_EACH_CIPHERSUITE
Paul Bakker5121ce52009-01-03 21:22:43 +00001014
Ron Eldor4a2fb4c2017-09-10 17:03:50 +03001015 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites (excluding SCSVs)", n ) );
Ron Eldor714785d2017-08-28 13:55:55 +03001016
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001017 /*
1018 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1019 */
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +02001020 if( mbedtls_ssl_get_renego_status( ssl ) == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001021 {
Ron Eldor4a2fb4c2017-09-10 17:03:50 +03001022 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding EMPTY_RENEGOTIATION_INFO_SCSV" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001023 *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
1024 *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO );
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001025 n++;
1026 }
1027
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001028 /* Some versions of OpenSSL don't handle it correctly if not at end */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001029#if defined(MBEDTLS_SSL_FALLBACK_SCSV)
Manuel Pégourié-Gonnard684b0592015-05-06 09:27:31 +01001030 if( ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK )
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001031 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001032 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding FALLBACK_SCSV" ) );
1033 *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 );
1034 *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE );
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001035 n++;
1036 }
1037#endif
1038
Paul Bakker2fbefde2013-06-29 16:01:15 +02001039 *q++ = (unsigned char)( n >> 7 );
1040 *q++ = (unsigned char)( n << 1 );
1041
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001042#if defined(MBEDTLS_ZLIB_SUPPORT)
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001043 offer_compress = 1;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001044#else
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001045 offer_compress = 0;
1046#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001047
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001048 /*
Johannes H4e5d23f2018-01-06 09:46:57 +01001049 * We don't support compression with DTLS right now: if many records come
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001050 * in the same datagram, uncompressing one could overwrite the next one.
1051 * We don't want to add complexity for handling that case unless there is
1052 * an actual need for it.
1053 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001054#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02001055 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) )
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001056 offer_compress = 0;
1057#endif
1058
1059 if( offer_compress )
1060 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001061 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
1062 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
1063 MBEDTLS_SSL_COMPRESS_DEFLATE, MBEDTLS_SSL_COMPRESS_NULL ) );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001064
1065 *p++ = 2;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001066 *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE;
1067 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001068 }
1069 else
1070 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001071 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
1072 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d",
1073 MBEDTLS_SSL_COMPRESS_NULL ) );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001074
1075 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001076 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001077 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001078
Paul Bakkerd3edc862013-03-20 16:07:17 +01001079 // First write extensions, then the total length
1080 //
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001081#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Paul Bakkerd3edc862013-03-20 16:07:17 +01001082 ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
1083 ext_len += olen;
Paul Bakker0be444a2013-08-27 21:55:01 +02001084#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001085
Hanno Becker40f8b512017-10-12 14:58:55 +01001086 /* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added
1087 * even if MBEDTLS_SSL_RENEGOTIATION is not defined. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001088#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd3edc862013-03-20 16:07:17 +01001089 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
1090 ext_len += olen;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001091#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001092
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001093#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1094 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +01001095 ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
1096 ext_len += olen;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001097#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001098
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +02001099#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01001100 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Ron Eldor755bb6a2018-02-14 19:30:48 +02001101 if( uses_ec )
1102 {
1103 ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
1104 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +01001105
Ron Eldor755bb6a2018-02-14 19:30:48 +02001106 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
1107 ext_len += olen;
1108 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001109#endif
1110
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02001111#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +02001112 ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );
1113 ext_len += olen;
1114#endif
1115
Hanno Beckera5a2b082019-05-15 14:03:01 +01001116#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker39ec5252019-04-25 16:55:15 +01001117 ssl_write_cid_ext( ssl, p + 2 + ext_len, &olen );
1118 ext_len += olen;
Hanno Beckera5a2b082019-05-15 14:03:01 +01001119#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker39ec5252019-04-25 16:55:15 +01001120
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001121#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001122 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
1123 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02001124#endif
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001125
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001126#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001127 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
1128 ext_len += olen;
Paul Bakker1f2bc622013-08-15 13:45:55 +02001129#endif
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001130
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001131#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001132 ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );
1133 ext_len += olen;
1134#endif
1135
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001136#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001137 ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );
1138 ext_len += olen;
1139#endif
1140
Simon Butcher5624ec82015-09-29 01:06:06 +01001141#if defined(MBEDTLS_SSL_ALPN)
1142 ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001143 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02001144#endif
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001145
Simon Butcher5624ec82015-09-29 01:06:06 +01001146#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1147 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001148 ext_len += olen;
1149#endif
1150
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001151 /* olen unused if all extensions are disabled */
1152 ((void) olen);
1153
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001154 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001155 ext_len ) );
1156
Paul Bakkera7036632014-04-30 10:15:38 +02001157 if( ext_len > 0 )
1158 {
1159 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
1160 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
1161 p += ext_len;
1162 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001163
Paul Bakker5121ce52009-01-03 21:22:43 +00001164 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001165 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
1166 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00001167
1168 ssl->state++;
1169
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001170#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02001171 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001172 mbedtls_ssl_send_flight_completed( ssl );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02001173#endif
1174
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02001175 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001176 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02001177 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001178 return( ret );
1179 }
1180
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02001181#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02001182 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) &&
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02001183 ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
1184 {
1185 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
1186 return( ret );
1187 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01001188#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02001189
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001190 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001191
1192 return( 0 );
1193}
1194
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001195static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001196 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +00001197 size_t len )
1198{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001199#if defined(MBEDTLS_SSL_RENEGOTIATION)
1200 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00001201 {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001202 /* Check verify-data in constant-time. The length OTOH is no secret */
Paul Bakker48916f92012-09-16 19:57:18 +00001203 if( len != 1 + ssl->verify_data_len * 2 ||
1204 buf[0] != ssl->verify_data_len * 2 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001205 mbedtls_ssl_safer_memcmp( buf + 1,
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001206 ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001207 mbedtls_ssl_safer_memcmp( buf + 1 + ssl->verify_data_len,
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001208 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001209 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001210 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001211 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1212 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001213 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001214 }
1215 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001216 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001217#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001218 {
1219 if( len != 1 || buf[0] != 0x00 )
1220 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001221 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001222 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1223 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001224 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001225 }
1226
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001227 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001228 }
Paul Bakker48916f92012-09-16 19:57:18 +00001229
1230 return( 0 );
1231}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001232
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001233#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1234static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001235 const unsigned char *buf,
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001236 size_t len )
1237{
1238 /*
1239 * server should use the extension only if we did,
1240 * and if so the server's value should match ours (and len is always 1)
1241 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001242 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ||
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001243 len != 1 ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001244 buf[0] != ssl->conf->mfl_code )
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001245 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001246 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching max fragment length extension" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001247 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1248 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001249 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001250 }
1251
1252 return( 0 );
1253}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001254#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Paul Bakker48916f92012-09-16 19:57:18 +00001255
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001256#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1257static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001258 const unsigned char *buf,
1259 size_t len )
1260{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001261 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ||
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001262 len != 0 )
1263 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001264 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching truncated HMAC extension" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001265 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1266 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001267 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001268 }
1269
1270 ((void) buf);
1271
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001272 ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001273
1274 return( 0 );
1275}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001276#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001277
Hanno Beckera5a2b082019-05-15 14:03:01 +01001278#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker1ba81f62019-04-26 15:37:26 +01001279static int ssl_parse_cid_ext( mbedtls_ssl_context *ssl,
1280 const unsigned char *buf,
1281 size_t len )
1282{
1283 size_t peer_cid_len;
1284
1285 if( /* CID extension only makes sense in DTLS */
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02001286 MBEDTLS_SSL_TRANSPORT_IS_TLS( ssl->conf->transport ) ||
Hanno Becker1ba81f62019-04-26 15:37:26 +01001287 /* The server must only send the CID extension if we have offered it. */
Hanno Becker8f68f872019-05-03 12:46:59 +01001288 ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED )
Hanno Becker1ba81f62019-04-26 15:37:26 +01001289 {
Hanno Becker8f68f872019-05-03 12:46:59 +01001290 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension unexpected" ) );
Hanno Becker1ba81f62019-04-26 15:37:26 +01001291 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Hanno Becker8f68f872019-05-03 12:46:59 +01001292 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1293 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1294 }
1295
1296 if( len == 0 )
1297 {
1298 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
1299 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1300 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Hanno Becker1ba81f62019-04-26 15:37:26 +01001301 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1302 }
1303
1304 peer_cid_len = *buf++;
1305 len--;
1306
1307 if( peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX )
1308 {
Hanno Becker8f68f872019-05-03 12:46:59 +01001309 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
Hanno Becker1ba81f62019-04-26 15:37:26 +01001310 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Hanno Becker8f68f872019-05-03 12:46:59 +01001311 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Hanno Becker1ba81f62019-04-26 15:37:26 +01001312 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1313 }
1314
1315 if( len != peer_cid_len )
1316 {
Hanno Becker8f68f872019-05-03 12:46:59 +01001317 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
Hanno Becker1ba81f62019-04-26 15:37:26 +01001318 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Hanno Becker8f68f872019-05-03 12:46:59 +01001319 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Hanno Becker1ba81f62019-04-26 15:37:26 +01001320 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1321 }
1322
Hanno Beckerf885d3b2019-05-03 12:47:49 +01001323 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker1ba81f62019-04-26 15:37:26 +01001324 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
1325 memcpy( ssl->handshake->peer_cid, buf, peer_cid_len );
1326
1327 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use of CID extension negotiated" ) );
1328 MBEDTLS_SSL_DEBUG_BUF( 3, "Server CID", buf, peer_cid_len );
1329
Hanno Becker1ba81f62019-04-26 15:37:26 +01001330 return( 0 );
1331}
Hanno Beckera5a2b082019-05-15 14:03:01 +01001332#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker1ba81f62019-04-26 15:37:26 +01001333
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001334#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1335static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001336 const unsigned char *buf,
1337 size_t len )
1338{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001339 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
Hanno Becker2881d802019-05-22 14:44:53 +01001340 mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_0 ||
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001341 len != 0 )
1342 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001343 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching encrypt-then-MAC extension" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001344 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1345 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001346 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001347 }
1348
1349 ((void) buf);
1350
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001351 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001352
1353 return( 0 );
1354}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001355#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001356
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001357#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1358static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001359 const unsigned char *buf,
1360 size_t len )
1361{
Hanno Beckeraabbb582019-06-11 13:43:27 +01001362 if( mbedtls_ssl_conf_get_ems( ssl->conf ) ==
1363 MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
Hanno Becker2881d802019-05-22 14:44:53 +01001364 mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_0 ||
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001365 len != 0 )
1366 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001367 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching extended master secret extension" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001368 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1369 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001370 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001371 }
1372
1373 ((void) buf);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001374 return( 0 );
1375}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001376#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001377
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001378#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1379static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001380 const unsigned char *buf,
1381 size_t len )
1382{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001383 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ||
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02001384 len != 0 )
1385 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001386 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching session ticket extension" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001387 mbedtls_ssl_send_alert_message( ssl, 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é-Gonnardaa0d4d12013-08-03 13:02:31 +02001390 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001391
1392 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02001393
1394 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001395
1396 return( 0 );
1397}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001398#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001399
Robert Cragie136884c2015-10-02 13:34:31 +01001400#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01001401 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001402static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001403 const unsigned char *buf,
1404 size_t len )
1405{
1406 size_t list_size;
1407 const unsigned char *p;
1408
Philippe Antoine747fd532018-05-30 09:13:21 +02001409 if( len == 0 || (size_t)( buf[0] + 1 ) != len )
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001410 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001411 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001412 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1413 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001414 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001415 }
Philippe Antoine747fd532018-05-30 09:13:21 +02001416 list_size = buf[0];
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001417
Manuel Pégourié-Gonnardfd35af12014-06-23 14:10:13 +02001418 p = buf + 1;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001419 while( list_size > 0 )
1420 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001421 if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
1422 p[0] == MBEDTLS_ECP_PF_COMPRESSED )
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001423 {
Robert Cragie136884c2015-10-02 13:34:31 +01001424#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +02001425 ssl->handshake->ecdh_ctx.point_format = p[0];
Gilles Peskine064a85c2017-05-10 10:46:40 +02001426#endif
Robert Cragieae8535d2015-10-06 17:11:18 +01001427#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Robert Cragie136884c2015-10-02 13:34:31 +01001428 ssl->handshake->ecjpake_ctx.point_format = p[0];
1429#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001430 MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001431 return( 0 );
1432 }
1433
1434 list_size--;
1435 p++;
1436 }
1437
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001438 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001439 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1440 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001441 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001442}
Darryl Green11999bb2018-03-13 15:22:58 +00001443#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
Robert Cragieae8535d2015-10-06 17:11:18 +01001444 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001445
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001446#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1447static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
1448 const unsigned char *buf,
1449 size_t len )
1450{
1451 int ret;
1452
Hanno Becker473f98f2019-06-26 10:27:32 +01001453 if( mbedtls_ssl_suite_get_key_exchange(
Hanno Beckerdf645962019-06-26 13:02:22 +01001454 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake ) )
1455 != MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001456 {
1457 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
1458 return( 0 );
1459 }
1460
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +02001461 /* If we got here, we no longer need our cached extension */
1462 mbedtls_free( ssl->handshake->ecjpake_cache );
1463 ssl->handshake->ecjpake_cache = NULL;
1464 ssl->handshake->ecjpake_cache_len = 0;
1465
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001466 if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
1467 buf, len ) ) != 0 )
1468 {
1469 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001470 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1471 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001472 return( ret );
1473 }
1474
1475 return( 0 );
1476}
1477#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001478
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001479#if defined(MBEDTLS_SSL_ALPN)
1480static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001481 const unsigned char *buf, size_t len )
1482{
1483 size_t list_len, name_len;
1484 const char **p;
1485
1486 /* If we didn't send it, the server shouldn't send it */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001487 if( ssl->conf->alpn_list == NULL )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001488 {
1489 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching ALPN extension" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001490 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1491 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001492 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001493 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001494
1495 /*
1496 * opaque ProtocolName<1..2^8-1>;
1497 *
1498 * struct {
1499 * ProtocolName protocol_name_list<2..2^16-1>
1500 * } ProtocolNameList;
1501 *
1502 * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
1503 */
1504
1505 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
1506 if( len < 4 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001507 {
1508 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1509 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001510 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001511 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001512
1513 list_len = ( buf[0] << 8 ) | buf[1];
1514 if( list_len != len - 2 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001515 {
1516 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1517 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001518 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001519 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001520
1521 name_len = buf[2];
1522 if( name_len != list_len - 1 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001523 {
1524 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1525 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001526 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001527 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001528
1529 /* Check that the server chosen protocol was in our list and save it */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001530 for( p = ssl->conf->alpn_list; *p != NULL; p++ )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001531 {
1532 if( name_len == strlen( *p ) &&
1533 memcmp( buf + 3, *p, name_len ) == 0 )
1534 {
1535 ssl->alpn_chosen = *p;
1536 return( 0 );
1537 }
1538 }
1539
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001540 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ALPN extension: no matching protocol" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001541 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1542 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001543 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001544}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001545#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001546
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001547/*
1548 * Parse HelloVerifyRequest. Only called after verifying the HS type.
1549 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001550#if defined(MBEDTLS_SSL_PROTO_DTLS)
1551static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001552{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001553 const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001554 int major_ver, minor_ver;
1555 unsigned char cookie_len;
1556
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001557 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001558
1559 /*
1560 * struct {
1561 * ProtocolVersion server_version;
1562 * opaque cookie<0..2^8-1>;
1563 * } HelloVerifyRequest;
1564 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001565 MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001566 mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001567 p += 2;
1568
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02001569 /*
1570 * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1)
1571 * even is lower than our min version.
1572 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001573 if( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
1574 minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ||
Hanno Beckere965bd32019-06-12 14:04:34 +01001575 major_ver > mbedtls_ssl_conf_get_max_major_ver( ssl->conf ) ||
1576 minor_ver > mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001577 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001578 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server version" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001579
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001580 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1581 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001582
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001583 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001584 }
1585
1586 cookie_len = *p++;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001587 MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001588
Andres AG5a87c932016-09-26 14:53:05 +01001589 if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len )
1590 {
1591 MBEDTLS_SSL_DEBUG_MSG( 1,
1592 ( "cookie length does not match incoming message size" ) );
1593 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1594 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1595 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1596 }
1597
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001598 mbedtls_free( ssl->handshake->verify_cookie );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001599
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001600 ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001601 if( ssl->handshake->verify_cookie == NULL )
1602 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02001603 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", cookie_len ) );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02001604 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001605 }
1606
1607 memcpy( ssl->handshake->verify_cookie, p, cookie_len );
1608 ssl->handshake->verify_cookie_len = cookie_len;
1609
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02001610 /* Start over at ClientHello */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001611 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
1612 mbedtls_ssl_reset_checksum( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001613
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001614 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001615
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001616 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse hello verify request" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001617
1618 return( 0 );
1619}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001620#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001621
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001622static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001623{
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001624 int ret, i;
Paul Bakker23986e52011-04-24 08:57:21 +00001625 size_t n;
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001626 size_t ext_len;
Paul Bakker48916f92012-09-16 19:57:18 +00001627 unsigned char *buf, *ext;
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001628 unsigned char comp;
1629#if defined(MBEDTLS_ZLIB_SUPPORT)
1630 int accept_comp;
1631#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001632#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001633 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001634#endif
Hanno Becker03b64fa2019-06-11 14:39:38 +01001635#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1636 int extended_ms_seen = 0;
1637#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001638 int handshake_failure = 0;
Hanno Becker14990272019-06-26 11:47:15 +01001639
1640 /* The ciphersuite chosen by the server. */
1641 mbedtls_ssl_ciphersuite_handle_t server_suite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001642
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001643 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001644
Hanno Becker327c93b2018-08-15 13:56:18 +01001645 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001646 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001647 /* No alert on a read error. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001648 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001649 return( ret );
1650 }
1651
Hanno Beckerf5970a02019-05-08 09:38:41 +01001652 buf = ssl->in_msg;
1653
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001654 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001655 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001656#if defined(MBEDTLS_SSL_RENEGOTIATION)
1657 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001658 {
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001659 ssl->renego_records_seen++;
1660
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001661 if( ssl->conf->renego_max_records >= 0 &&
1662 ssl->renego_records_seen > ssl->conf->renego_max_records )
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001663 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001664 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, "
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001665 "but not honored by server" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001666 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001667 }
1668
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001669 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-handshake message during renego" ) );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01001670
1671 ssl->keep_current_message = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001672 return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO );
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001673 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001674#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001675
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001676 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001677 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1678 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001679 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001680 }
1681
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001682#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02001683 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001684 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001685 if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001686 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001687 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received hello verify request" ) );
1688 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001689 return( ssl_parse_hello_verify_request( ssl ) );
1690 }
1691 else
1692 {
1693 /* We made it through the verification process */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001694 mbedtls_free( ssl->handshake->verify_cookie );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001695 ssl->handshake->verify_cookie = NULL;
1696 ssl->handshake->verify_cookie_len = 0;
1697 }
1698 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001699#endif /* MBEDTLS_SSL_PROTO_DTLS */
Paul Bakker5121ce52009-01-03 21:22:43 +00001700
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001701 if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) ||
1702 buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO )
Paul Bakker5121ce52009-01-03 21:22:43 +00001703 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001704 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001705 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1706 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001707 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001708 }
1709
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001710 /*
1711 * 0 . 1 server_version
1712 * 2 . 33 random (maybe including 4 bytes of Unix time)
1713 * 34 . 34 session_id length = n
1714 * 35 . 34+n session_id
1715 * 35+n . 36+n cipher_suite
1716 * 37+n . 37+n compression_method
1717 *
1718 * 38+n . 39+n extensions length (optional)
1719 * 40+n . .. extensions
1720 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001721 buf += mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001722
Paul Bakker1d29fb52012-09-28 13:28:45 +00001723 {
Hanno Becker3fa1ee52019-05-22 14:44:37 +01001724 int major_ver, minor_ver;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001725
Hanno Becker3fa1ee52019-05-22 14:44:37 +01001726 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", buf + 0, 2 );
1727 mbedtls_ssl_read_version( &major_ver, &minor_ver,
1728 ssl->conf->transport,
1729 buf + 0 );
Paul Bakker1d29fb52012-09-28 13:28:45 +00001730
Hanno Becker3fa1ee52019-05-22 14:44:37 +01001731 if( major_ver < mbedtls_ssl_conf_get_min_major_ver( ssl->conf ) ||
1732 minor_ver < mbedtls_ssl_conf_get_min_minor_ver( ssl->conf ) ||
1733 major_ver > mbedtls_ssl_conf_get_max_major_ver( ssl->conf ) ||
1734 minor_ver > mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) )
1735 {
1736 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server version out of bounds - "
1737 " min: [%d:%d], server: [%d:%d], max: [%d:%d]",
1738 mbedtls_ssl_conf_get_min_major_ver( ssl->conf ),
1739 mbedtls_ssl_conf_get_min_minor_ver( ssl->conf ),
1740 major_ver, minor_ver,
1741 mbedtls_ssl_conf_get_max_major_ver( ssl->conf ),
1742 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ) );
1743
1744 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1745 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
1746
1747 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
1748 }
1749
Hanno Becker381eaa52019-06-12 14:43:01 +01001750#if !defined(MBEDTLS_SSL_CONF_FIXED_MINOR_VER)
Hanno Becker3fa1ee52019-05-22 14:44:37 +01001751 ssl->minor_ver = minor_ver;
Hanno Becker381eaa52019-06-12 14:43:01 +01001752#endif /* !MBEDTLS_SSL_CONF_FIXED_MINOR_VER */
1753
1754#if !defined(MBEDTLS_SSL_CONF_FIXED_MAJOR_VER)
Hanno Becker3fa1ee52019-05-22 14:44:37 +01001755 ssl->major_ver = major_ver;
Hanno Becker381eaa52019-06-12 14:43:01 +01001756#endif /* !MBEDTLS_SSL_CONF_FIXED_MAJOR_VER */
Paul Bakker1d29fb52012-09-28 13:28:45 +00001757 }
1758
Andres Amaya Garcia6bce9cb2017-09-06 15:33:34 +01001759 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu",
1760 ( (uint32_t) buf[2] << 24 ) |
1761 ( (uint32_t) buf[3] << 16 ) |
1762 ( (uint32_t) buf[4] << 8 ) |
1763 ( (uint32_t) buf[5] ) ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001764
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001765 memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001766
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001767 n = buf[34];
Paul Bakker5121ce52009-01-03 21:22:43 +00001768
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001769 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 2, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001770
Paul Bakker48916f92012-09-16 19:57:18 +00001771 if( n > 32 )
1772 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001773 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001774 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1775 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001776 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001777 }
1778
Manuel Pégourié-Gonnarda6e5bd52015-07-23 12:14:13 +02001779 if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +00001780 {
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001781 ext_len = ( ( buf[38 + n] << 8 )
1782 | ( buf[39 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001783
Paul Bakker48916f92012-09-16 19:57:18 +00001784 if( ( ext_len > 0 && ext_len < 4 ) ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001785 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len )
Paul Bakker48916f92012-09-16 19:57:18 +00001786 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001787 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001788 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1789 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001790 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001791 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001792 }
Manuel Pégourié-Gonnarda6e5bd52015-07-23 12:14:13 +02001793 else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n )
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001794 {
1795 ext_len = 0;
1796 }
1797 else
1798 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001799 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001800 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1801 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001802 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001803 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001804
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001805 /* ciphersuite (used later) */
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001806 i = ( buf[35 + n] << 8 ) | buf[36 + n];
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001807
1808 /*
1809 * Read and check compression
1810 */
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001811 comp = buf[37 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +00001812
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001813#if defined(MBEDTLS_ZLIB_SUPPORT)
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001814 /* See comments in ssl_write_client_hello() */
Manuel Pégourié-Gonnardff4bd9f2019-06-06 10:34:48 +02001815 accept_comp = MBEDTLS_SSL_TRANSPORT_IS_TLS( ssl->conf->transport );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001816
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001817 if( comp != MBEDTLS_SSL_COMPRESS_NULL &&
1818 ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) )
1819#else /* MBEDTLS_ZLIB_SUPPORT */
1820 if( comp != MBEDTLS_SSL_COMPRESS_NULL )
1821#endif/* MBEDTLS_ZLIB_SUPPORT */
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001822 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001823 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server hello, bad compression: %d", comp ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001824 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1825 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001826 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001827 }
1828
Paul Bakker380da532012-04-18 16:10:25 +00001829 /*
1830 * Initialize update checksum functions
1831 */
Hanno Becker14990272019-06-26 11:47:15 +01001832 server_suite_info = mbedtls_ssl_ciphersuite_from_id( i );
Hanno Becker73f4cb12019-06-27 13:51:07 +01001833#if !defined(MBEDTLS_SSL_CONF_SINGLE_CIPHERSUITE)
Hanno Becker14990272019-06-26 11:47:15 +01001834 ssl->handshake->ciphersuite_info = server_suite_info;
1835#endif
1836 if( server_suite_info == MBEDTLS_SSL_CIPHERSUITE_INVALID_HANDLE )
Paul Bakker68884e32013-01-07 18:20:04 +01001837 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001838 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %04x not found", i ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001839 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1840 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001841 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +01001842 }
Hanno Becker14990272019-06-26 11:47:15 +01001843 mbedtls_ssl_optimize_checksum( ssl, server_suite_info );
Manuel Pégourié-Gonnard3c599f12014-03-10 13:25:07 +01001844
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001845 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
1846 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 35, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001847
1848 /*
1849 * Check if the session can be resumed
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +02001850 *
1851 * We're only resuming a session if it was requested (handshake->resume
1852 * already set to 1 by mbedtls_ssl_set_session()), and further conditions
1853 * are satisfied (not renegotiating, ID and ciphersuite match, etc).
1854 *
1855 * Update handshake->resume to the value it will keep for the rest of the
1856 * handshake, and that will be used to determine the relative order
1857 * client/server last flights, as well as in handshake_wrapup().
Paul Bakker5121ce52009-01-03 21:22:43 +00001858 */
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001859#if !defined(MBEDTLS_SSL_NO_SESSION_RESUMPTION)
1860 if( n == 0 ||
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +02001861 mbedtls_ssl_get_renego_status( ssl ) != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
Hanno Beckere02758c2019-06-26 15:31:31 +01001862 mbedtls_ssl_session_get_ciphersuite( ssl->session_negotiate ) != i ||
Paul Bakker48916f92012-09-16 19:57:18 +00001863 ssl->session_negotiate->compression != comp ||
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001864 ssl->session_negotiate->id_len != n ||
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001865 memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001866 {
Paul Bakker0a597072012-09-25 21:55:46 +00001867 ssl->handshake->resume = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001868 }
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +02001869#endif /* !MBEDTLS_SSL_NO_SESSION_RESUMPTION */
1870
1871 if( mbedtls_ssl_handshake_get_resume( ssl->handshake ) == 1 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001872 {
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +02001873 /* Resume a session */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001874 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00001875
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001876 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Paul Bakkerff60ee62010-03-16 21:09:09 +00001877 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001878 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001879 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1880 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Paul Bakkerff60ee62010-03-16 21:09:09 +00001881 return( ret );
1882 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001883 }
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001884 else
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001885 {
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +02001886 /* Start a new session */
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001887 ssl->state++;
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001888#if defined(MBEDTLS_HAVE_TIME)
1889 ssl->session_negotiate->start = mbedtls_time( NULL );
1890#endif
Hanno Becker73f4cb12019-06-27 13:51:07 +01001891#if !defined(MBEDTLS_SSL_CONF_SINGLE_CIPHERSUITE)
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001892 ssl->session_negotiate->ciphersuite = i;
Hanno Becker73f4cb12019-06-27 13:51:07 +01001893#endif /* MBEDTLS_SSL_CONF_SINGLE_CIPHERSUITE */
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001894 ssl->session_negotiate->compression = comp;
1895 ssl->session_negotiate->id_len = n;
1896 memcpy( ssl->session_negotiate->id, buf + 35, n );
1897 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001898
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001899 MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Manuel Pégourié-Gonnard3652e992019-07-01 12:09:22 +02001900 mbedtls_ssl_handshake_get_resume( ssl->handshake ) ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001901
Manuel Pégourié-Gonnard60884a12015-09-16 11:13:41 +02001902 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", i ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001903 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[37 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001904
Andrzej Kurek03bac442018-04-25 05:06:07 -04001905 /*
1906 * Perform cipher suite validation in same way as in ssl_write_client_hello.
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01001907 */
Hanno Becker14990272019-06-26 11:47:15 +01001908 MBEDTLS_SSL_BEGIN_FOR_EACH_CIPHERSUITE( ssl,
1909 ssl->minor_ver,
1910 ciphersuite_info )
Paul Bakker5121ce52009-01-03 21:22:43 +00001911 {
Hanno Becker14990272019-06-26 11:47:15 +01001912 if( ssl_validate_ciphersuite( ciphersuite_info, ssl,
Hanno Becker2881d802019-05-22 14:44:53 +01001913 mbedtls_ssl_conf_get_min_minor_ver( ssl->conf ),
1914 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001915 {
Hanno Beckerf4d6b492019-07-02 17:13:14 +01001916 continue;
Paul Bakker5121ce52009-01-03 21:22:43 +00001917 }
1918
Hanno Becker14990272019-06-26 11:47:15 +01001919 if( ciphersuite_info != server_suite_info )
Hanno Beckerf4d6b492019-07-02 17:13:14 +01001920 continue;
Paul Bakker5121ce52009-01-03 21:22:43 +00001921
Hanno Becker14990272019-06-26 11:47:15 +01001922 goto server_picked_valid_suite;
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01001923 }
Hanno Becker14990272019-06-26 11:47:15 +01001924 MBEDTLS_SSL_END_FOR_EACH_CIPHERSUITE
1925
1926 /* If we reach this code-path, the server's chosen ciphersuite
1927 * wasn't among those advertised by us. */
1928 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1929 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1930 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
1931 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1932
1933server_picked_valid_suite:
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01001934
Hanno Becker473f98f2019-06-26 10:27:32 +01001935 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s",
Hanno Becker14990272019-06-26 11:47:15 +01001936 mbedtls_ssl_suite_get_name( server_suite_info ) ) );
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01001937
Manuel Pégourié-Gonnardda19f4c2018-06-12 12:40:54 +02001938#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Hanno Becker14990272019-06-26 11:47:15 +01001939 if( mbedtls_ssl_suite_get_key_exchange( server_suite_info ) ==
Hanno Becker473f98f2019-06-26 10:27:32 +01001940 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA &&
Hanno Becker2881d802019-05-22 14:44:53 +01001941 mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardda19f4c2018-06-12 12:40:54 +02001942 {
1943 ssl->handshake->ecrs_enabled = 1;
1944 }
1945#endif
1946
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001947 if( comp != MBEDTLS_SSL_COMPRESS_NULL
1948#if defined(MBEDTLS_ZLIB_SUPPORT)
1949 && comp != MBEDTLS_SSL_COMPRESS_DEFLATE
Paul Bakker2770fbd2012-07-03 13:30:23 +00001950#endif
1951 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001952 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001953 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001954 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Hanno Becker2881d802019-05-22 14:44:53 +01001955 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001956 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001957 }
Paul Bakker48916f92012-09-16 19:57:18 +00001958 ssl->session_negotiate->compression = comp;
Paul Bakker5121ce52009-01-03 21:22:43 +00001959
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001960 ext = buf + 40 + n;
Paul Bakker48916f92012-09-16 19:57:18 +00001961
Hanno Becker2881d802019-05-22 14:44:53 +01001962 MBEDTLS_SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d",
1963 ext_len ) );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001964
Paul Bakker48916f92012-09-16 19:57:18 +00001965 while( ext_len )
1966 {
1967 unsigned int ext_id = ( ( ext[0] << 8 )
1968 | ( ext[1] ) );
1969 unsigned int ext_size = ( ( ext[2] << 8 )
1970 | ( ext[3] ) );
1971
1972 if( ext_size + 4 > ext_len )
1973 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001974 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001975 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Hanno Becker2881d802019-05-22 14:44:53 +01001976 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001977 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001978 }
1979
1980 switch( ext_id )
1981 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001982 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
1983 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
1984#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001985 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001986#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001987
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001988 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4,
1989 ext_size ) ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001990 return( ret );
1991
1992 break;
1993
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001994#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1995 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
1996 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001997
1998 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
1999 ext + 4, ext_size ) ) != 0 )
2000 {
2001 return( ret );
2002 }
2003
2004 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002005#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02002006
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002007#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
2008 case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
2009 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002010
2011 if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
2012 ext + 4, ext_size ) ) != 0 )
2013 {
2014 return( ret );
2015 }
2016
2017 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002018#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002019
Hanno Beckera5a2b082019-05-15 14:03:01 +01002020#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker1ba81f62019-04-26 15:37:26 +01002021 case MBEDTLS_TLS_EXT_CID:
2022 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found CID extension" ) );
2023
2024 if( ( ret = ssl_parse_cid_ext( ssl,
2025 ext + 4,
2026 ext_size ) ) != 0 )
2027 {
2028 return( ret );
2029 }
2030
2031 break;
Hanno Beckera5a2b082019-05-15 14:03:01 +01002032#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker1ba81f62019-04-26 15:37:26 +01002033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002034#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2035 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
2036 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002037
2038 if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl,
2039 ext + 4, ext_size ) ) != 0 )
2040 {
2041 return( ret );
2042 }
2043
2044 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002045#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002046
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002047#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2048 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
2049 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended_master_secret extension" ) );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002050
2051 if( ( ret = ssl_parse_extended_ms_ext( ssl,
2052 ext + 4, ext_size ) ) != 0 )
2053 {
2054 return( ret );
2055 }
Hanno Becker03b64fa2019-06-11 14:39:38 +01002056 extended_ms_seen = 1;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002057
2058 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002059#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002060
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002061#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2062 case MBEDTLS_TLS_EXT_SESSION_TICKET:
2063 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02002064
2065 if( ( ret = ssl_parse_session_ticket_ext( ssl,
2066 ext + 4, ext_size ) ) != 0 )
2067 {
2068 return( ret );
2069 }
2070
2071 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002072#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02002073
Robert Cragie136884c2015-10-02 13:34:31 +01002074#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01002075 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002076 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
2077 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002078
2079 if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
2080 ext + 4, ext_size ) ) != 0 )
2081 {
2082 return( ret );
2083 }
2084
2085 break;
Robert Cragieae8535d2015-10-06 17:11:18 +01002086#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
2087 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002088
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02002089#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2090 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
2091 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) );
2092
2093 if( ( ret = ssl_parse_ecjpake_kkpp( ssl,
2094 ext + 4, ext_size ) ) != 0 )
2095 {
2096 return( ret );
2097 }
2098
2099 break;
2100#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002101
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002102#if defined(MBEDTLS_SSL_ALPN)
2103 case MBEDTLS_TLS_EXT_ALPN:
2104 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002105
2106 if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 )
2107 return( ret );
2108
2109 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002110#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002111
Paul Bakker48916f92012-09-16 19:57:18 +00002112 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002113 MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
Paul Bakker48916f92012-09-16 19:57:18 +00002114 ext_id ) );
2115 }
2116
2117 ext_len -= 4 + ext_size;
2118 ext += 4 + ext_size;
2119
2120 if( ext_len > 0 && ext_len < 4 )
2121 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002122 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
2123 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00002124 }
2125 }
2126
2127 /*
2128 * Renegotiation security checks
2129 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002130 if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Hanno Beckerb0b2b672019-06-12 16:58:10 +01002131 mbedtls_ssl_conf_get_allow_legacy_renegotiation( ssl->conf ) ==
2132 MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00002133 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002134 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002135 handshake_failure = 1;
2136 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002137#if defined(MBEDTLS_SSL_RENEGOTIATION)
2138 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2139 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Paul Bakker48916f92012-09-16 19:57:18 +00002140 renegotiation_info_seen == 0 )
2141 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002142 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002143 handshake_failure = 1;
2144 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002145 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2146 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Hanno Beckerb0b2b672019-06-12 16:58:10 +01002147 mbedtls_ssl_conf_get_allow_legacy_renegotiation( ssl->conf ) ==
2148 MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00002149 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002150 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002151 handshake_failure = 1;
2152 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002153 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2154 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002155 renegotiation_info_seen == 1 )
2156 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002157 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002158 handshake_failure = 1;
2159 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002160#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002161
Jarno Lamsa842be162019-06-10 15:05:33 +03002162 /*
2163 * Check if extended master secret is being enforced
2164 */
2165#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Hanno Beckeraabbb582019-06-11 13:43:27 +01002166 if( mbedtls_ssl_conf_get_ems( ssl->conf ) ==
Hanno Becker03b64fa2019-06-11 14:39:38 +01002167 MBEDTLS_SSL_EXTENDED_MS_ENABLED )
Jarno Lamsa842be162019-06-10 15:05:33 +03002168 {
Hanno Becker03b64fa2019-06-11 14:39:38 +01002169 if( extended_ms_seen )
2170 {
Hanno Becker1ab322b2019-06-11 14:50:54 +01002171#if !defined(MBEDTLS_SSL_EXTENDED_MS_ENFORCED)
Hanno Becker03b64fa2019-06-11 14:39:38 +01002172 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Hanno Becker1ab322b2019-06-11 14:50:54 +01002173#endif /* !MBEDTLS_SSL_EXTENDED_MS_ENFORCED */
Hanno Becker03b64fa2019-06-11 14:39:38 +01002174 }
2175 else if( mbedtls_ssl_conf_get_ems_enforced( ssl->conf ) ==
2176 MBEDTLS_SSL_EXTENDED_MS_ENFORCE_ENABLED )
2177 {
2178 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Peer not offering extended master "
Jarno Lamsa842be162019-06-10 15:05:33 +03002179 "secret, while it is enforced") );
Hanno Becker03b64fa2019-06-11 14:39:38 +01002180 handshake_failure = 1;
2181 }
Jarno Lamsa842be162019-06-10 15:05:33 +03002182 }
2183#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
2184
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002185 if( handshake_failure == 1 )
2186 {
Gilles Peskinec94f7352017-05-10 16:37:56 +02002187 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2188 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002189 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00002190 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002191
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002192 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002193
2194 return( 0 );
2195}
2196
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002197#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2198 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
2199static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl, unsigned char **p,
Paul Bakker29e1f122013-04-16 13:07:56 +02002200 unsigned char *end )
2201{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002202 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker29e1f122013-04-16 13:07:56 +02002203
Paul Bakker29e1f122013-04-16 13:07:56 +02002204 /*
2205 * Ephemeral DH parameters:
2206 *
2207 * struct {
2208 * opaque dh_p<1..2^16-1>;
2209 * opaque dh_g<1..2^16-1>;
2210 * opaque dh_Ys<1..2^16-1>;
2211 * } ServerDHParams;
2212 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002213 if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002214 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002215 MBEDTLS_SSL_DEBUG_RET( 2, ( "mbedtls_dhm_read_params" ), ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002216 return( ret );
2217 }
2218
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02002219 if( ssl->handshake->dhm_ctx.len * 8 < ssl->conf->dhm_min_bitlen )
Paul Bakker29e1f122013-04-16 13:07:56 +02002220 {
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02002221 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHM prime too short: %d < %d",
2222 ssl->handshake->dhm_ctx.len * 8,
2223 ssl->conf->dhm_min_bitlen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002224 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002225 }
2226
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002227 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
2228 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
2229 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +02002230
2231 return( ret );
2232}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002233#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2234 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002235
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002236#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2237 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2238 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
2239 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2240 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2241static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002242{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002243 const mbedtls_ecp_curve_info *curve_info;
Janos Follath3fbdada2018-08-15 10:26:53 +01002244 mbedtls_ecp_group_id grp_id;
2245#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
2246 grp_id = ssl->handshake->ecdh_ctx.grp.id;
2247#else
2248 grp_id = ssl->handshake->ecdh_ctx.grp_id;
2249#endif
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002250
Janos Follath3fbdada2018-08-15 10:26:53 +01002251 curve_info = mbedtls_ecp_curve_info_from_grp_id( grp_id );
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002252 if( curve_info == NULL )
2253 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002254 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2255 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002256 }
2257
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002258 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002259
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02002260#if defined(MBEDTLS_ECP_C)
Janos Follath3fbdada2018-08-15 10:26:53 +01002261 if( mbedtls_ssl_check_curve( ssl, grp_id ) != 0 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002262#else
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002263 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
2264 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002265#endif
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002266 return( -1 );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002267
Janos Follath3fbdada2018-08-15 10:26:53 +01002268 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
2269 MBEDTLS_DEBUG_ECDH_QP );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002270
2271 return( 0 );
2272}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002273#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2274 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2275 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2276 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2277 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002278
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002279#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2280 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2281 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2282static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
Paul Bakker29e1f122013-04-16 13:07:56 +02002283 unsigned char **p,
2284 unsigned char *end )
2285{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002286 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker29e1f122013-04-16 13:07:56 +02002287
Paul Bakker29e1f122013-04-16 13:07:56 +02002288 /*
2289 * Ephemeral ECDH parameters:
2290 *
2291 * struct {
2292 * ECParameters curve_params;
2293 * ECPoint public;
2294 * } ServerECDHParams;
2295 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002296 if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx,
Paul Bakker29e1f122013-04-16 13:07:56 +02002297 (const unsigned char **) p, end ) ) != 0 )
2298 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002299 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_read_params" ), ret );
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02002300#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnard1c1c20e2018-09-12 10:34:43 +02002301 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
2302 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02002303#endif
Paul Bakker29e1f122013-04-16 13:07:56 +02002304 return( ret );
2305 }
2306
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002307 if( ssl_check_server_ecdh_params( ssl ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002308 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002309 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDHE curve)" ) );
2310 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002311 }
2312
Paul Bakker29e1f122013-04-16 13:07:56 +02002313 return( ret );
2314}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002315#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2316 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2317 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002318
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002319#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
2320static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002321 unsigned char **p,
2322 unsigned char *end )
2323{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002324 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002325 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02002326 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002327
2328 /*
2329 * PSK parameters:
2330 *
2331 * opaque psk_identity_hint<0..2^16-1>;
2332 */
Hanno Becker0c161d12018-10-08 13:40:50 +01002333 if( end - (*p) < 2 )
Krzysztof Stachowiak740b2182018-03-13 11:31:14 +01002334 {
2335 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message "
2336 "(psk_identity_hint length)" ) );
2337 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2338 }
Manuel Pégourié-Gonnard59b9fe22013-10-15 11:55:33 +02002339 len = (*p)[0] << 8 | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002340 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002341
Hanno Becker8df10232018-10-10 15:48:39 +01002342 if( end - (*p) < (int) len )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002343 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002344 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message "
2345 "(psk_identity_hint length)" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002346 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002347 }
2348
Manuel Pégourié-Gonnard9d624122016-02-22 11:10:14 +01002349 /*
2350 * Note: we currently ignore the PKS identity hint, as we only allow one
2351 * PSK to be provisionned on the client. This could be changed later if
2352 * someone needs that feature.
2353 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002354 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002355 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002356
2357 return( ret );
2358}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002359#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002361#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
2362 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002363/*
2364 * Generate a pre-master secret and encrypt it with the server's RSA key
2365 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002366static int ssl_write_encrypted_pms( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002367 size_t offset, size_t *olen,
2368 size_t pms_offset )
2369{
2370 int ret;
Hanno Becker2881d802019-05-22 14:44:53 +01002371 size_t len_bytes = mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002372 unsigned char *p = ssl->handshake->premaster + pms_offset;
Hanno Becker5882dd02019-06-06 16:25:57 +01002373 mbedtls_pk_context *peer_pk = NULL;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002374
Angus Grattond8213d02016-05-25 20:56:48 +10002375 if( offset + len_bytes > MBEDTLS_SSL_OUT_CONTENT_LEN )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02002376 {
2377 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) );
2378 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2379 }
2380
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002381 /*
2382 * Generate (part of) the pre-master as
2383 * struct {
2384 * ProtocolVersion client_version;
2385 * opaque random[46];
2386 * } PreMasterSecret;
2387 */
Hanno Beckere965bd32019-06-12 14:04:34 +01002388 mbedtls_ssl_write_version( mbedtls_ssl_conf_get_max_major_ver( ssl->conf ),
2389 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ),
2390 ssl->conf->transport, p );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002391
Hanno Beckerece325c2019-06-13 15:39:27 +01002392 if( ( ret = mbedtls_ssl_conf_get_frng( ssl->conf )
2393 ( ssl->conf->p_rng, p + 2, 46 ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002394 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002395 MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002396 return( ret );
2397 }
2398
2399 ssl->handshake->pmslen = 48;
2400
Hanno Becker374800a2019-02-06 16:49:54 +00002401#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Becker5882dd02019-06-06 16:25:57 +01002402 /* Because the peer CRT pubkey is embedded into the handshake
2403 * params currently, and there's no 'is_init' functions for PK
2404 * contexts, we need to break the abstraction and peek into
2405 * the PK context to see if it has been initialized. */
2406 if( ssl->handshake->peer_pubkey.pk_info != NULL )
2407 peer_pk = &ssl->handshake->peer_pubkey;
Hanno Becker374800a2019-02-06 16:49:54 +00002408#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker5882dd02019-06-06 16:25:57 +01002409 if( ssl->session_negotiate->peer_cert != NULL )
Hanno Becker0c168162019-02-28 14:02:30 +00002410 {
2411 ret = mbedtls_x509_crt_pk_acquire( ssl->session_negotiate->peer_cert,
2412 &peer_pk );
2413 if( ret != 0 )
2414 {
Hanno Becker2224ccf2019-06-28 10:52:45 +01002415 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_x509_crt_pk_acquire", ret );
2416 return( ret );
Hanno Becker0c168162019-02-28 14:02:30 +00002417 }
2418 }
Hanno Becker5882dd02019-06-06 16:25:57 +01002419#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2420
2421 if( peer_pk == NULL )
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002422 {
Hanno Beckerf02d5502019-02-06 17:37:32 +00002423 /* Should never happen */
Hanno Beckere9839c02019-02-26 11:51:06 +00002424 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Hanno Beckerf02d5502019-02-06 17:37:32 +00002425 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002426 }
2427
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002428 /*
2429 * Now write it out, encrypted
2430 */
Hanno Becker374800a2019-02-06 16:49:54 +00002431 if( ! mbedtls_pk_can_do( peer_pk, MBEDTLS_PK_RSA ) )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002432 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002433 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
Hanno Becker0c168162019-02-28 14:02:30 +00002434 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2435 goto cleanup;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002436 }
2437
Hanno Becker374800a2019-02-06 16:49:54 +00002438 if( ( ret = mbedtls_pk_encrypt( peer_pk,
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002439 p, ssl->handshake->pmslen,
2440 ssl->out_msg + offset + len_bytes, olen,
Angus Grattond8213d02016-05-25 20:56:48 +10002441 MBEDTLS_SSL_OUT_CONTENT_LEN - offset - len_bytes,
Hanno Beckerece325c2019-06-13 15:39:27 +01002442 mbedtls_ssl_conf_get_frng( ssl->conf ),
2443 ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002444 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002445 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_rsa_pkcs1_encrypt", ret );
Hanno Becker0c168162019-02-28 14:02:30 +00002446 goto cleanup;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002447 }
2448
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002449#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2450 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002451 if( len_bytes == 2 )
2452 {
2453 ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 );
2454 ssl->out_msg[offset+1] = (unsigned char)( *olen );
2455 *olen += 2;
2456 }
2457#endif
2458
Hanno Becker0c168162019-02-28 14:02:30 +00002459cleanup:
2460
Hanno Becker6c83db72019-02-08 14:06:00 +00002461#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2462 /* We don't need the peer's public key anymore. Free it. */
2463 mbedtls_pk_free( peer_pk );
Hanno Becker0c168162019-02-28 14:02:30 +00002464#else
Hanno Beckerc6d1c3e2019-03-05 13:50:56 +00002465 mbedtls_x509_crt_pk_release( ssl->session_negotiate->peer_cert );
Hanno Becker0c168162019-02-28 14:02:30 +00002466#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2467
2468 return( ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002469}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002470#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
2471 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002472
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002473#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard5c2a7ca2015-10-23 08:48:41 +02002474#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2475 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2476 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002477static int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl,
Paul Bakker29e1f122013-04-16 13:07:56 +02002478 unsigned char **p,
2479 unsigned char *end,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002480 mbedtls_md_type_t *md_alg,
2481 mbedtls_pk_type_t *pk_alg )
Paul Bakker29e1f122013-04-16 13:07:56 +02002482{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02002483 ((void) ssl);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002484 *md_alg = MBEDTLS_MD_NONE;
2485 *pk_alg = MBEDTLS_PK_NONE;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002486
2487 /* Only in TLS 1.2 */
Hanno Becker2881d802019-05-22 14:44:53 +01002488 if( mbedtls_ssl_get_minor_ver( ssl ) != MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002489 {
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002490 return( 0 );
2491 }
Paul Bakker29e1f122013-04-16 13:07:56 +02002492
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002493 if( (*p) + 2 > end )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002494 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002495
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002496 /*
2497 * Get hash algorithm
2498 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002499 if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) ) == MBEDTLS_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002500 {
Manuel Pégourié-Gonnardd8053242015-12-08 09:53:51 +01002501 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Server used unsupported "
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02002502 "HashAlgorithm %d", *(p)[0] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002503 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002504 }
2505
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002506 /*
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002507 * Get signature algorithm
2508 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002509 if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) ) == MBEDTLS_PK_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002510 {
Manuel Pégourié-Gonnardd8053242015-12-08 09:53:51 +01002511 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used unsupported "
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02002512 "SignatureAlgorithm %d", (*p)[1] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002513 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002514 }
2515
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02002516 /*
2517 * Check if the hash is acceptable
2518 */
2519 if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 )
2520 {
Gilles Peskinecd3c8452017-05-09 14:57:45 +02002521 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used HashAlgorithm %d that was not offered",
2522 *(p)[0] ) );
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02002523 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2524 }
2525
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002526 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
2527 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02002528 *p += 2;
2529
2530 return( 0 );
2531}
Manuel Pégourié-Gonnard5c2a7ca2015-10-23 08:48:41 +02002532#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2533 MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2534 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002535#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02002536
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002537#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2538 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2539static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002540{
2541 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002542 const mbedtls_ecp_keypair *peer_key;
Hanno Becker53b6b7e2019-02-06 17:44:07 +00002543 mbedtls_pk_context * peer_pk;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002544
Hanno Becker53b6b7e2019-02-06 17:44:07 +00002545#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2546 peer_pk = &ssl->handshake->peer_pubkey;
2547#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002548 if( ssl->session_negotiate->peer_cert == NULL )
2549 {
Hanno Beckerf02d5502019-02-06 17:37:32 +00002550 /* Should never happen */
Hanno Beckerc39e23e2019-02-26 12:36:01 +00002551 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Hanno Beckerf02d5502019-02-06 17:37:32 +00002552 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002553 }
Hanno Becker39ae65c2019-02-28 14:03:20 +00002554
2555 ret = mbedtls_x509_crt_pk_acquire( ssl->session_negotiate->peer_cert,
2556 &peer_pk );
2557 if( ret != 0 )
2558 {
Hanno Becker2224ccf2019-06-28 10:52:45 +01002559 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_x509_crt_pk_acquire", ret );
2560 return( ret );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002561 }
Hanno Becker53b6b7e2019-02-06 17:44:07 +00002562#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002563
Hanno Becker53b6b7e2019-02-06 17:44:07 +00002564 if( ! mbedtls_pk_can_do( peer_pk, MBEDTLS_PK_ECKEY ) )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002565 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002566 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002567 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2568 goto cleanup;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002569 }
2570
Hanno Becker53b6b7e2019-02-06 17:44:07 +00002571 peer_key = mbedtls_pk_ec( *peer_pk );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002572
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002573 if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,
2574 MBEDTLS_ECDH_THEIRS ) ) != 0 )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002575 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002576 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002577 goto cleanup;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002578 }
2579
2580 if( ssl_check_server_ecdh_params( ssl ) != 0 )
2581 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002582 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002583 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
2584 goto cleanup;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002585 }
2586
Hanno Becker39ae65c2019-02-28 14:03:20 +00002587cleanup:
2588
Hanno Becker6c83db72019-02-08 14:06:00 +00002589#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2590 /* We don't need the peer's public key anymore. Free it,
2591 * so that more RAM is available for upcoming expensive
2592 * operations like ECDHE. */
2593 mbedtls_pk_free( peer_pk );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002594#else
Hanno Beckerc6d1c3e2019-03-05 13:50:56 +00002595 mbedtls_x509_crt_pk_release( ssl->session_negotiate->peer_cert );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002596#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker6c83db72019-02-08 14:06:00 +00002597
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002598 return( ret );
2599}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002600#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2601 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002602
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002603static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
Paul Bakker41c83d32013-03-20 14:39:14 +01002604{
Paul Bakker23986e52011-04-24 08:57:21 +00002605 int ret;
Hanno Becker473f98f2019-06-26 10:27:32 +01002606 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01002607 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Andres Amaya Garcia53c77cc2017-06-27 16:15:06 +01002608 unsigned char *p = NULL, *end = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00002609
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002610 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002611
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002612#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002613 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) ==
2614 MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00002615 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002616 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002617 ssl->state++;
2618 return( 0 );
2619 }
Manuel Pégourié-Gonnardbac0e3b2013-10-15 11:54:47 +02002620 ((void) p);
2621 ((void) end);
2622#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002623
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002624#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2625 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002626 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) ==
2627 MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
2628 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) ==
2629 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002630 {
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002631 if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 )
2632 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002633 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002634 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2635 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002636 return( ret );
2637 }
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002638
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002639 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002640 ssl->state++;
2641 return( 0 );
2642 }
2643 ((void) p);
2644 ((void) end);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002645#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2646 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002647
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002648#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02002649 if( ssl->handshake->ecrs_enabled &&
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002650 ssl->handshake->ecrs_state == ssl_ecrs_ske_start_processing )
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02002651 {
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002652 goto start_processing;
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02002653 }
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002654#endif
2655
Hanno Becker327c93b2018-08-15 13:56:18 +01002656 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002657 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002658 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002659 return( ret );
2660 }
2661
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002662 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002663 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002664 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002665 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2666 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002667 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002668 }
2669
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002670 /*
2671 * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
2672 * doesn't use a psk_identity_hint
2673 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002674 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002675 {
Hanno Becker473f98f2019-06-26 10:27:32 +01002676 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2677 == MBEDTLS_KEY_EXCHANGE_PSK ||
2678 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2679 == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Paul Bakker188c8de2013-04-19 09:13:37 +02002680 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002681 /* Current message is probably either
2682 * CertificateRequest or ServerHelloDone */
2683 ssl->keep_current_message = 1;
Paul Bakker188c8de2013-04-19 09:13:37 +02002684 goto exit;
2685 }
2686
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002687 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key exchange message must "
2688 "not be skipped" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002689 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2690 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002691
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002692 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002693 }
2694
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002695#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
2696 if( ssl->handshake->ecrs_enabled )
2697 ssl->handshake->ecrs_state = ssl_ecrs_ske_start_processing;
2698
2699start_processing:
2700#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002701 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Paul Bakker3b6a07b2013-03-21 11:56:50 +01002702 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002703 MBEDTLS_SSL_DEBUG_BUF( 3, "server key exchange", p, end - p );
Paul Bakker3b6a07b2013-03-21 11:56:50 +01002704
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002705#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002706 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2707 == MBEDTLS_KEY_EXCHANGE_PSK ||
2708 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2709 == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
2710 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2711 == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2712 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2713 == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002714 {
2715 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
2716 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002717 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002718 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2719 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002720 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002721 }
2722 } /* FALLTROUGH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002723#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002724
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002725#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \
2726 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002727 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2728 == MBEDTLS_KEY_EXCHANGE_PSK ||
2729 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2730 == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
2731 {
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002732 ; /* nothing more to do */
Hanno Becker473f98f2019-06-26 10:27:32 +01002733 }
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002734 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002735#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||
2736 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
2737#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2738 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002739 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2740 == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
2741 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2742 == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00002743 {
Paul Bakker29e1f122013-04-16 13:07:56 +02002744 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01002745 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002746 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002747 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2748 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002749 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002750 }
2751 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002752 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002753#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2754 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
2755#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2756 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
2757 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002758 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2759 == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
2760 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2761 == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
2762 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2763 == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002764 {
2765 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
2766 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002767 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002768 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2769 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002770 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker41c83d32013-03-20 14:39:14 +01002771 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002772 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002773 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002774#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2775 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2776 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002777#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002778 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2779 == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002780 {
2781 ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
2782 p, end - p );
2783 if( ret != 0 )
2784 {
2785 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002786 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2787 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002788 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2789 }
2790 }
2791 else
2792#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002793 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002794 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2795 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002796 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002797
Hanno Becker1aa267c2017-04-28 17:08:27 +01002798#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)
2799 if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002800 {
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00002801 size_t sig_len, hashlen;
2802 unsigned char hash[64];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002803 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
2804 mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
2805 unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00002806 size_t params_len = p - params;
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002807 void *rs_ctx = NULL;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002808
Hanno Becker69fad132019-02-06 18:26:03 +00002809 mbedtls_pk_context * peer_pk;
2810
Paul Bakker29e1f122013-04-16 13:07:56 +02002811 /*
2812 * Handle the digitally-signed structure
2813 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002814#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker2881d802019-05-22 14:44:53 +01002815 if( mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002816 {
Paul Bakker9659dae2013-08-28 16:21:34 +02002817 if( ssl_parse_signature_algorithm( ssl, &p, end,
2818 &md_alg, &pk_alg ) != 0 )
2819 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002820 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002821 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2822 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002823 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker9659dae2013-08-28 16:21:34 +02002824 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002825
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002826 if( pk_alg != mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002827 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002828 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002829 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2830 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002831 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002832 }
2833 }
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02002834 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002835#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2836#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2837 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Hanno Becker2881d802019-05-22 14:44:53 +01002838 if( mbedtls_ssl_get_minor_ver( ssl ) < MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02002839 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002840 pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002841
Paul Bakker9659dae2013-08-28 16:21:34 +02002842 /* Default hash for ECDSA is SHA-1 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002843 if( pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE )
2844 md_alg = MBEDTLS_MD_SHA1;
Paul Bakker9659dae2013-08-28 16:21:34 +02002845 }
2846 else
2847#endif
2848 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002849 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2850 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker9659dae2013-08-28 16:21:34 +02002851 }
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002852
2853 /*
2854 * Read signature
2855 */
Krzysztof Stachowiaka1098f82018-03-13 11:28:49 +01002856
2857 if( p > end - 2 )
2858 {
2859 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2860 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2861 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
2862 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2863 }
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002864 sig_len = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00002865 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002866
Krzysztof Stachowiak027f84c2018-03-13 11:29:24 +01002867 if( p != end - sig_len )
Paul Bakker41c83d32013-03-20 14:39:14 +01002868 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002869 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002870 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2871 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002872 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker41c83d32013-03-20 14:39:14 +01002873 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002874
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002875 MBEDTLS_SSL_DEBUG_BUF( 3, "signature", p, sig_len );
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02002876
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002877 /*
2878 * Compute the hash that has been signed
2879 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002880#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2881 defined(MBEDTLS_SSL_PROTO_TLS1_1)
2882 if( md_alg == MBEDTLS_MD_NONE )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00002883 {
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002884 hashlen = 36;
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01002885 ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash, params,
2886 params_len );
2887 if( ret != 0 )
Andres Amaya Garciaf0e521e2017-06-28 12:11:42 +01002888 return( ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002889 }
2890 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002891#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
2892 MBEDTLS_SSL_PROTO_TLS1_1 */
2893#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2894 defined(MBEDTLS_SSL_PROTO_TLS1_2)
2895 if( md_alg != MBEDTLS_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002896 {
Gilles Peskineca1d7422018-04-24 11:53:22 +02002897 ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, &hashlen,
2898 params, params_len,
2899 md_alg );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01002900 if( ret != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002901 return( ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002902 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002903 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002904#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
2905 MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02002906 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002907 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2908 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02002909 }
Paul Bakker29e1f122013-04-16 13:07:56 +02002910
Gilles Peskineca1d7422018-04-24 11:53:22 +02002911 MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
Paul Bakker29e1f122013-04-16 13:07:56 +02002912
Hanno Becker69fad132019-02-06 18:26:03 +00002913#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2914 peer_pk = &ssl->handshake->peer_pubkey;
2915#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002916 if( ssl->session_negotiate->peer_cert == NULL )
2917 {
Hanno Beckerf02d5502019-02-06 17:37:32 +00002918 /* Should never happen */
Hanno Beckerc39e23e2019-02-26 12:36:01 +00002919 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Hanno Beckerf02d5502019-02-06 17:37:32 +00002920 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002921 }
Hanno Becker2fefa482019-02-28 14:03:46 +00002922
2923 ret = mbedtls_x509_crt_pk_acquire( ssl->session_negotiate->peer_cert,
2924 &peer_pk );
2925 if( ret != 0 )
2926 {
Hanno Becker2224ccf2019-06-28 10:52:45 +01002927 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_x509_crt_pk_acquire", ret );
2928 return( ret );
Hanno Becker2fefa482019-02-28 14:03:46 +00002929 }
Hanno Becker69fad132019-02-06 18:26:03 +00002930#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002931
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002932 /*
2933 * Verify signature
2934 */
Hanno Becker69fad132019-02-06 18:26:03 +00002935 if( !mbedtls_pk_can_do( peer_pk, pk_alg ) )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002936 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002937 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002938 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2939 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Hanno Becker2fefa482019-02-28 14:03:46 +00002940#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Beckerc6d1c3e2019-03-05 13:50:56 +00002941 mbedtls_x509_crt_pk_release( ssl->session_negotiate->peer_cert );
Hanno Becker2fefa482019-02-28 14:03:46 +00002942#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002943 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002944 }
2945
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002946#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02002947 if( ssl->handshake->ecrs_enabled )
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +02002948 rs_ctx = &ssl->handshake->ecrs_ctx.pk;
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002949#endif
2950
Hanno Becker69fad132019-02-06 18:26:03 +00002951 if( ( ret = mbedtls_pk_verify_restartable( peer_pk,
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002952 md_alg, hash, hashlen, p, sig_len, rs_ctx ) ) != 0 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002953 {
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002954#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
2955 if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS )
2956#endif
2957 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2958 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002959 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02002960#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
2961 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
2962 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
2963#endif
Hanno Becker2fefa482019-02-28 14:03:46 +00002964#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Beckerc6d1c3e2019-03-05 13:50:56 +00002965 mbedtls_x509_crt_pk_release( ssl->session_negotiate->peer_cert );
Hanno Becker2fefa482019-02-28 14:03:46 +00002966#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Paul Bakkerc70b9822013-04-07 22:00:46 +02002967 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00002968 }
Hanno Becker6c83db72019-02-08 14:06:00 +00002969
2970#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2971 /* We don't need the peer's public key anymore. Free it,
2972 * so that more RAM is available for upcoming expensive
2973 * operations like ECDHE. */
2974 mbedtls_pk_free( peer_pk );
Hanno Becker2fefa482019-02-28 14:03:46 +00002975#else
Hanno Beckerc6d1c3e2019-03-05 13:50:56 +00002976 mbedtls_x509_crt_pk_release( ssl->session_negotiate->peer_cert );
Hanno Becker2fefa482019-02-28 14:03:46 +00002977#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Paul Bakker5121ce52009-01-03 21:22:43 +00002978 }
Hanno Becker1aa267c2017-04-28 17:08:27 +01002979#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002980
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002981exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00002982 ssl->state++;
2983
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002984 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002985
2986 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002987}
2988
Hanno Becker1aa267c2017-04-28 17:08:27 +01002989#if ! defined(MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002990static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002991{
Hanno Becker473f98f2019-06-26 10:27:32 +01002992 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01002993 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002994
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002995 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002996
Hanno Becker1aa267c2017-04-28 17:08:27 +01002997 if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002998 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002999 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003000 ssl->state++;
3001 return( 0 );
3002 }
3003
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003004 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3005 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003006}
Hanno Becker1aa267c2017-04-28 17:08:27 +01003007#else /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003008static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003009{
3010 int ret;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003011 unsigned char *buf;
3012 size_t n = 0;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003013 size_t cert_type_len = 0, dn_len = 0;
Hanno Becker473f98f2019-06-26 10:27:32 +01003014 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01003015 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Paul Bakker5121ce52009-01-03 21:22:43 +00003016
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003017 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003018
Hanno Becker1aa267c2017-04-28 17:08:27 +01003019 if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003020 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003021 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003022 ssl->state++;
3023 return( 0 );
3024 }
3025
Hanno Becker327c93b2018-08-15 13:56:18 +01003026 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003027 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003028 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3029 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003030 }
3031
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003032 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
3033 {
3034 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
3035 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3036 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
3037 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
3038 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003039
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003040 ssl->state++;
3041 ssl->client_auth = ( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST );
Paul Bakker5121ce52009-01-03 21:22:43 +00003042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003043 MBEDTLS_SSL_DEBUG_MSG( 3, ( "got %s certificate request",
Paul Bakker5121ce52009-01-03 21:22:43 +00003044 ssl->client_auth ? "a" : "no" ) );
3045
Paul Bakker926af752012-11-23 13:38:07 +01003046 if( ssl->client_auth == 0 )
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003047 {
3048 /* Current message is probably the ServerHelloDone */
3049 ssl->keep_current_message = 1;
Paul Bakker926af752012-11-23 13:38:07 +01003050 goto exit;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003051 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003052
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02003053 /*
3054 * struct {
3055 * ClientCertificateType certificate_types<1..2^8-1>;
3056 * SignatureAndHashAlgorithm
3057 * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only
3058 * DistinguishedName certificate_authorities<0..2^16-1>;
3059 * } CertificateRequest;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003060 *
3061 * Since we only support a single certificate on clients, let's just
3062 * ignore all the information that's supposed to help us pick a
3063 * certificate.
3064 *
3065 * We could check that our certificate matches the request, and bail out
3066 * if it doesn't, but it's simpler to just send the certificate anyway,
3067 * and give the server the opportunity to decide if it should terminate
3068 * the connection when it doesn't like our certificate.
3069 *
3070 * Same goes for the hash in TLS 1.2's signature_algorithms: at this
3071 * point we only have one hash available (see comments in
Simon Butcherc0957bd2016-03-01 13:16:57 +00003072 * write_certificate_verify), so let's just use what we have.
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003073 *
3074 * However, we still minimally parse the message to check it is at least
3075 * superficially sane.
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02003076 */
Paul Bakker926af752012-11-23 13:38:07 +01003077 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02003078
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003079 /* certificate_types */
Krzysztof Stachowiak73b183c2018-04-05 10:20:09 +02003080 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) )
3081 {
3082 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
3083 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3084 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
3085 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
3086 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003087 cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )];
Paul Bakker926af752012-11-23 13:38:07 +01003088 n = cert_type_len;
3089
Krzysztof Stachowiakbc145f72018-03-20 11:19:50 +01003090 /*
Krzysztof Stachowiak94d49972018-04-05 14:48:55 +02003091 * In the subsequent code there are two paths that read from buf:
Krzysztof Stachowiakbc145f72018-03-20 11:19:50 +01003092 * * the length of the signature algorithms field (if minor version of
3093 * SSL is 3),
3094 * * distinguished name length otherwise.
3095 * Both reach at most the index:
3096 * ...hdr_len + 2 + n,
3097 * therefore the buffer length at this point must be greater than that
3098 * regardless of the actual code path.
3099 */
3100 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
Paul Bakker926af752012-11-23 13:38:07 +01003101 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003102 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003103 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3104 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003105 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
Paul Bakker926af752012-11-23 13:38:07 +01003106 }
3107
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003108 /* supported_signature_algorithms */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003109#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker2881d802019-05-22 14:44:53 +01003110 if( mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01003111 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003112 size_t sig_alg_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
3113 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
Simon Butcher99000142016-10-13 17:21:01 +01003114#if defined(MBEDTLS_DEBUG_C)
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003115 unsigned char* sig_alg;
Simon Butcher99000142016-10-13 17:21:01 +01003116 size_t i;
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003117#endif
Simon Butcher99000142016-10-13 17:21:01 +01003118
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003119 /*
Krzysztof Stachowiak94d49972018-04-05 14:48:55 +02003120 * The furthest access in buf is in the loop few lines below:
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003121 * sig_alg[i + 1],
3122 * where:
3123 * sig_alg = buf + ...hdr_len + 3 + n,
3124 * max(i) = sig_alg_len - 1.
Krzysztof Stachowiak94d49972018-04-05 14:48:55 +02003125 * Therefore the furthest access is:
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003126 * buf[...hdr_len + 3 + n + sig_alg_len - 1 + 1],
3127 * which reduces to:
3128 * buf[...hdr_len + 3 + n + sig_alg_len],
3129 * which is one less than we need the buf to be.
3130 */
3131 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n + sig_alg_len )
3132 {
3133 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
3134 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3135 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
3136 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
3137 }
3138
3139#if defined(MBEDTLS_DEBUG_C)
3140 sig_alg = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n;
Simon Butcher99000142016-10-13 17:21:01 +01003141 for( i = 0; i < sig_alg_len; i += 2 )
3142 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003143 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Supported Signature Algorithm found: %d"
3144 ",%d", sig_alg[i], sig_alg[i + 1] ) );
Simon Butcher99000142016-10-13 17:21:01 +01003145 }
3146#endif
Paul Bakker926af752012-11-23 13:38:07 +01003147
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003148 n += 2 + sig_alg_len;
Paul Bakkerf7abd422013-04-16 13:15:56 +02003149 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003150#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker926af752012-11-23 13:38:07 +01003151
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003152 /* certificate_authorities */
3153 dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
3154 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01003155
3156 n += dn_len;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003157 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n )
Paul Bakker926af752012-11-23 13:38:07 +01003158 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003159 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003160 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3161 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003162 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
Paul Bakker926af752012-11-23 13:38:07 +01003163 }
3164
3165exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003166 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003167
3168 return( 0 );
3169}
Hanno Becker1aa267c2017-04-28 17:08:27 +01003170#endif /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003171
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003172static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003173{
3174 int ret;
3175
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003176 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003177
Hanno Becker327c93b2018-08-15 13:56:18 +01003178 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003179 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003180 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3181 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003182 }
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003183
3184 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
3185 {
3186 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
3187 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
3188 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003189
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003190 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ||
3191 ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003192 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003193 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003194 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3195 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003196 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003197 }
3198
3199 ssl->state++;
3200
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003201#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02003202 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003203 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003204#endif
3205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003206 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003207
3208 return( 0 );
3209}
3210
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003211static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003212{
Paul Bakker23986e52011-04-24 08:57:21 +00003213 int ret;
3214 size_t i, n;
Hanno Becker473f98f2019-06-26 10:27:32 +01003215 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01003216 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Paul Bakker5121ce52009-01-03 21:22:43 +00003217
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003218 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003219
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003220#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003221 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003222 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003223 /*
3224 * DHM key exchange -- send G^X mod P
3225 */
Paul Bakker48916f92012-09-16 19:57:18 +00003226 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00003227
3228 ssl->out_msg[4] = (unsigned char)( n >> 8 );
3229 ssl->out_msg[5] = (unsigned char)( n );
3230 i = 6;
3231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003232 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
3233 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker5121ce52009-01-03 21:22:43 +00003234 &ssl->out_msg[i], n,
Hanno Beckerece325c2019-06-13 15:39:27 +01003235 mbedtls_ssl_conf_get_frng( ssl->conf ),
3236 ssl->conf->p_rng );
Paul Bakker5121ce52009-01-03 21:22:43 +00003237 if( ret != 0 )
3238 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003239 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003240 return( ret );
3241 }
3242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003243 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
3244 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00003245
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003246 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
Paul Bakker48916f92012-09-16 19:57:18 +00003247 ssl->handshake->premaster,
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +01003248 MBEDTLS_PREMASTER_SIZE,
Manuel Pégourié-Gonnard2d627642013-09-04 14:22:07 +02003249 &ssl->handshake->pmslen,
Hanno Beckerece325c2019-06-13 15:39:27 +01003250 mbedtls_ssl_conf_get_frng( ssl->conf ),
3251 ssl->conf->p_rng ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003252 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003253 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003254 return( ret );
3255 }
3256
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003257 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00003258 }
3259 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003260#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
3261#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3262 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3263 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3264 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003265 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3266 == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3267 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3268 == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3269 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3270 == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
3271 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3272 == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01003273 {
3274 /*
3275 * ECDH key exchange -- send client public value
3276 */
3277 i = 4;
3278
Manuel Pégourié-Gonnard2350b4e2017-05-16 09:26:48 +02003279#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003280 if( ssl->handshake->ecrs_enabled )
3281 {
Manuel Pégourié-Gonnardc37423f2018-10-16 10:28:17 +02003282 if( ssl->handshake->ecrs_state == ssl_ecrs_cke_ecdh_calc_secret )
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003283 goto ecdh_calc_secret;
Manuel Pégourié-Gonnard23e41622017-05-18 12:35:37 +02003284
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003285 mbedtls_ecdh_enable_restart( &ssl->handshake->ecdh_ctx );
3286 }
Manuel Pégourié-Gonnard2350b4e2017-05-16 09:26:48 +02003287#endif
3288
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003289 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,
Paul Bakker41c83d32013-03-20 14:39:14 +01003290 &n,
3291 &ssl->out_msg[i], 1000,
Hanno Beckerece325c2019-06-13 15:39:27 +01003292 mbedtls_ssl_conf_get_frng( ssl->conf ),
3293 ssl->conf->p_rng );
Paul Bakker41c83d32013-03-20 14:39:14 +01003294 if( ret != 0 )
3295 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003296 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02003297#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3298 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3299 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3300#endif
Paul Bakker41c83d32013-03-20 14:39:14 +01003301 return( ret );
3302 }
3303
Janos Follath3fbdada2018-08-15 10:26:53 +01003304 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3305 MBEDTLS_DEBUG_ECDH_Q );
Paul Bakker41c83d32013-03-20 14:39:14 +01003306
Manuel Pégourié-Gonnard2350b4e2017-05-16 09:26:48 +02003307#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003308 if( ssl->handshake->ecrs_enabled )
3309 {
3310 ssl->handshake->ecrs_n = n;
Manuel Pégourié-Gonnardc37423f2018-10-16 10:28:17 +02003311 ssl->handshake->ecrs_state = ssl_ecrs_cke_ecdh_calc_secret;
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003312 }
Manuel Pégourié-Gonnard2350b4e2017-05-16 09:26:48 +02003313
3314ecdh_calc_secret:
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003315 if( ssl->handshake->ecrs_enabled )
3316 n = ssl->handshake->ecrs_n;
Manuel Pégourié-Gonnard2350b4e2017-05-16 09:26:48 +02003317#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003318 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
Paul Bakker41c83d32013-03-20 14:39:14 +01003319 &ssl->handshake->pmslen,
3320 ssl->handshake->premaster,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003321 MBEDTLS_MPI_MAX_SIZE,
Hanno Beckerece325c2019-06-13 15:39:27 +01003322 mbedtls_ssl_conf_get_frng( ssl->conf ),
3323 ssl->conf->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003324 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003325 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02003326#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3327 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3328 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3329#endif
Paul Bakker41c83d32013-03-20 14:39:14 +01003330 return( ret );
3331 }
3332
Janos Follath3fbdada2018-08-15 10:26:53 +01003333 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3334 MBEDTLS_DEBUG_ECDH_Z );
Paul Bakker41c83d32013-03-20 14:39:14 +01003335 }
3336 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003337#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3338 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3339 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3340 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3341#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Hanno Becker1aa267c2017-04-28 17:08:27 +01003342 if( mbedtls_ssl_ciphersuite_uses_psk( ciphersuite_info ) )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003343 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003344 /*
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003345 * opaque psk_identity<0..2^16-1>;
3346 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003347 if( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL )
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003348 {
3349 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for PSK" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003350 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003351 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003352
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003353 i = 4;
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003354 n = ssl->conf->psk_identity_len;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003355
Angus Grattond8213d02016-05-25 20:56:48 +10003356 if( i + 2 + n > MBEDTLS_SSL_OUT_CONTENT_LEN )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003357 {
3358 MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity too long or "
3359 "SSL buffer too short" ) );
3360 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3361 }
3362
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003363 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
3364 ssl->out_msg[i++] = (unsigned char)( n );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003365
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003366 memcpy( ssl->out_msg + i, ssl->conf->psk_identity, ssl->conf->psk_identity_len );
3367 i += ssl->conf->psk_identity_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003368
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003369#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003370 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3371 == MBEDTLS_KEY_EXCHANGE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003372 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003373 n = 0;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003374 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003375 else
3376#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003377#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003378 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3379 == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003380 {
3381 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 2 ) ) != 0 )
3382 return( ret );
3383 }
3384 else
3385#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003386#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003387 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3388 == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003389 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003390 /*
3391 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
3392 */
3393 n = ssl->handshake->dhm_ctx.len;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003394
Angus Grattond8213d02016-05-25 20:56:48 +10003395 if( i + 2 + n > MBEDTLS_SSL_OUT_CONTENT_LEN )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003396 {
3397 MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity or DHM size too long"
3398 " or SSL buffer too short" ) );
3399 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3400 }
3401
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003402 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
3403 ssl->out_msg[i++] = (unsigned char)( n );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003404
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003405 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
3406 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003407 &ssl->out_msg[i], n,
Hanno Beckerece325c2019-06-13 15:39:27 +01003408 mbedtls_ssl_conf_get_frng( ssl->conf ),
3409 ssl->conf->p_rng );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003410 if( ret != 0 )
3411 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003412 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003413 return( ret );
3414 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003415 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003416 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003417#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
3418#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003419 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3420 == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003421 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003422 /*
3423 * ClientECDiffieHellmanPublic public;
3424 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003425 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n,
Angus Grattond8213d02016-05-25 20:56:48 +10003426 &ssl->out_msg[i], MBEDTLS_SSL_OUT_CONTENT_LEN - i,
Hanno Beckerece325c2019-06-13 15:39:27 +01003427 mbedtls_ssl_conf_get_frng( ssl->conf ),
3428 ssl->conf->p_rng );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003429 if( ret != 0 )
3430 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003431 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003432 return( ret );
3433 }
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003434
Janos Follath3fbdada2018-08-15 10:26:53 +01003435 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3436 MBEDTLS_DEBUG_ECDH_Q );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003437 }
3438 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003439#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003440 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003441 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3442 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003443 }
3444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003445 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Hanno Becker473f98f2019-06-26 10:27:32 +01003446 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003447 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003448 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003449 return( ret );
3450 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003451 }
3452 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003453#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
3454#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003455 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) ==
3456 MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003457 {
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003458 i = 4;
3459 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 0 ) ) != 0 )
Paul Bakkera3d195c2011-11-27 21:07:34 +00003460 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003461 }
Paul Bakkered27a042013-04-18 22:46:23 +02003462 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003463#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003464#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003465 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) ==
3466 MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003467 {
3468 i = 4;
3469
3470 ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
Angus Grattond8213d02016-05-25 20:56:48 +10003471 ssl->out_msg + i, MBEDTLS_SSL_OUT_CONTENT_LEN - i, &n,
Hanno Beckerece325c2019-06-13 15:39:27 +01003472 mbedtls_ssl_conf_get_frng( ssl->conf ),
3473 ssl->conf->p_rng );
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003474 if( ret != 0 )
3475 {
3476 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
3477 return( ret );
3478 }
3479
3480 ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
3481 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
Hanno Beckerece325c2019-06-13 15:39:27 +01003482 mbedtls_ssl_conf_get_frng( ssl->conf ),
3483 ssl->conf->p_rng );
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003484 if( ret != 0 )
3485 {
3486 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
3487 return( ret );
3488 }
3489 }
3490 else
3491#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02003492 {
3493 ((void) ciphersuite_info);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003494 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3495 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakkered27a042013-04-18 22:46:23 +02003496 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003497
Paul Bakker5121ce52009-01-03 21:22:43 +00003498 ssl->out_msglen = i + n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003499 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3500 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003501
3502 ssl->state++;
3503
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003504 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003505 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003506 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003507 return( ret );
3508 }
3509
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003510 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003511
3512 return( 0 );
3513}
3514
Hanno Beckerae39b9e2019-02-07 12:32:43 +00003515#if !defined(MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003516static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003517{
Hanno Becker473f98f2019-06-26 10:27:32 +01003518 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01003519 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003520 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003521
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003522 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003523
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003524 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003525 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003526 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003527 return( ret );
3528 }
3529
Hanno Beckerae39b9e2019-02-07 12:32:43 +00003530 if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Paul Bakkered27a042013-04-18 22:46:23 +02003531 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003532 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakkered27a042013-04-18 22:46:23 +02003533 ssl->state++;
3534 return( 0 );
3535 }
3536
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003537 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3538 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003539}
Hanno Beckerae39b9e2019-02-07 12:32:43 +00003540#else /* !MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003541static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003542{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003543 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker473f98f2019-06-26 10:27:32 +01003544 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01003545 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003546 size_t n = 0, offset = 0;
3547 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003548 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003549 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnarda5759752019-05-03 11:43:28 +02003550 size_t hashlen;
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003551 void *rs_ctx = NULL;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003552
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003553 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003554
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003555#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003556 if( ssl->handshake->ecrs_enabled &&
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003557 ssl->handshake->ecrs_state == ssl_ecrs_crt_vrfy_sign )
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003558 {
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003559 goto sign;
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003560 }
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003561#endif
3562
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003563 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003564 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003565 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003566 return( ret );
3567 }
3568
Hanno Beckerae39b9e2019-02-07 12:32:43 +00003569 if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003570 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003571 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003572 ssl->state++;
3573 return( 0 );
3574 }
3575
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003576 if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003577 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003578 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003579 ssl->state++;
3580 return( 0 );
3581 }
3582
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003583 if( mbedtls_ssl_own_key( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003584 {
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003585 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for certificate" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003586 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003587 }
3588
3589 /*
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003590 * Make a signature of the handshake digests
Paul Bakker5121ce52009-01-03 21:22:43 +00003591 */
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003592#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3593 if( ssl->handshake->ecrs_enabled )
3594 ssl->handshake->ecrs_state = ssl_ecrs_crt_vrfy_sign;
3595
3596sign:
3597#endif
3598
Manuel Pégourié-Gonnarda5759752019-05-03 11:43:28 +02003599 ssl->handshake->calc_verify( ssl, hash, &hashlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00003600
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003601#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3602 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Hanno Becker2881d802019-05-22 14:44:53 +01003603 if( mbedtls_ssl_get_minor_ver( ssl ) != MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003604 {
Paul Bakker926af752012-11-23 13:38:07 +01003605 /*
3606 * digitally-signed struct {
3607 * opaque md5_hash[16];
3608 * opaque sha_hash[20];
3609 * };
3610 *
3611 * md5_hash
3612 * MD5(handshake_messages);
3613 *
3614 * sha_hash
3615 * SHA(handshake_messages);
3616 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003617 md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003618
3619 /*
3620 * For ECDSA, default hash is SHA-1 only
3621 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003622 if( mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003623 {
3624 hash_start += 16;
3625 hashlen -= 16;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003626 md_alg = MBEDTLS_MD_SHA1;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003627 }
Paul Bakker926af752012-11-23 13:38:07 +01003628 }
3629 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003630#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
3631 MBEDTLS_SSL_PROTO_TLS1_1 */
3632#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker2881d802019-05-22 14:44:53 +01003633 if( mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01003634 {
3635 /*
3636 * digitally-signed struct {
3637 * opaque handshake_messages[handshake_messages_length];
3638 * };
3639 *
3640 * Taking shortcut here. We assume that the server always allows the
3641 * PRF Hash function and has sent it in the allowed signature
3642 * algorithms list received in the Certificate Request message.
3643 *
3644 * Until we encounter a server that does not, we will take this
3645 * shortcut.
3646 *
3647 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
3648 * in order to satisfy 'weird' needs from the server side.
3649 */
Hanno Beckerdf645962019-06-26 13:02:22 +01003650 if( mbedtls_ssl_suite_get_mac(
3651 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake ) )
Hanno Becker473f98f2019-06-26 10:27:32 +01003652 == MBEDTLS_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00003653 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003654 md_alg = MBEDTLS_MD_SHA384;
3655 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00003656 }
3657 else
3658 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003659 md_alg = MBEDTLS_MD_SHA256;
3660 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00003661 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003662 ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003663
Manuel Pégourié-Gonnardbfe32ef2013-08-22 14:55:30 +02003664 /* Info from md_alg will be used instead */
3665 hashlen = 0;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003666 offset = 2;
3667 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003668 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003669#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02003670 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003671 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3672 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02003673 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003674
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003675#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003676 if( ssl->handshake->ecrs_enabled )
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +02003677 rs_ctx = &ssl->handshake->ecrs_ctx.pk;
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003678#endif
3679
3680 if( ( ret = mbedtls_pk_sign_restartable( mbedtls_ssl_own_key( ssl ),
3681 md_alg, hash_start, hashlen,
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003682 ssl->out_msg + 6 + offset, &n,
Hanno Beckerece325c2019-06-13 15:39:27 +01003683 mbedtls_ssl_conf_get_frng( ssl->conf ),
3684 ssl->conf->p_rng, rs_ctx ) ) != 0 )
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02003685 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003686 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02003687#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3688 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3689 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3690#endif
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003691 return( ret );
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02003692 }
Paul Bakker926af752012-11-23 13:38:07 +01003693
Paul Bakker1ef83d62012-04-11 12:09:53 +00003694 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
3695 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003696
Paul Bakker1ef83d62012-04-11 12:09:53 +00003697 ssl->out_msglen = 6 + n + offset;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003698 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3699 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00003700
3701 ssl->state++;
3702
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003703 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003704 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003705 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003706 return( ret );
3707 }
3708
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003709 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003710
Paul Bakkered27a042013-04-18 22:46:23 +02003711 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003712}
Hanno Beckerae39b9e2019-02-07 12:32:43 +00003713#endif /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003714
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003715#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3716static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003717{
3718 int ret;
3719 uint32_t lifetime;
3720 size_t ticket_len;
3721 unsigned char *ticket;
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003722 const unsigned char *msg;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003723
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003724 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003725
Hanno Becker327c93b2018-08-15 13:56:18 +01003726 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003727 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003728 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003729 return( ret );
3730 }
3731
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003732 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003733 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003734 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003735 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3736 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003737 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003738 }
3739
3740 /*
3741 * struct {
3742 * uint32 ticket_lifetime_hint;
3743 * opaque ticket<0..2^16-1>;
3744 * } NewSessionTicket;
3745 *
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003746 * 0 . 3 ticket_lifetime_hint
3747 * 4 . 5 ticket_len (n)
3748 * 6 . 5+n ticket content
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003749 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003750 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET ||
3751 ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003752 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003753 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003754 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3755 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003756 return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003757 }
3758
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003759 msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003760
Philippe Antoineb5b25432018-05-11 11:06:29 +02003761 lifetime = ( ((uint32_t) msg[0]) << 24 ) | ( msg[1] << 16 ) |
3762 ( msg[2] << 8 ) | ( msg[3] );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003763
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003764 ticket_len = ( msg[4] << 8 ) | ( msg[5] );
3765
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003766 if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003767 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003768 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003769 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3770 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003771 return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003772 }
3773
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003774 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003775
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02003776 /* We're not waiting for a NewSessionTicket message any more */
3777 ssl->handshake->new_session_ticket = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003778 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02003779
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003780 /*
3781 * Zero-length ticket means the server changed his mind and doesn't want
3782 * to send a ticket after all, so just forget it
3783 */
Paul Bakker66d5d072014-06-17 16:39:18 +02003784 if( ticket_len == 0 )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003785 return( 0 );
3786
Hanno Becker3d699e42019-01-30 14:46:35 +00003787 if( ssl->session != NULL && ssl->session->ticket != NULL )
3788 {
3789 mbedtls_platform_zeroize( ssl->session->ticket,
3790 ssl->session->ticket_len );
3791 mbedtls_free( ssl->session->ticket );
3792 ssl->session->ticket = NULL;
3793 ssl->session->ticket_len = 0;
3794 }
3795
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05003796 mbedtls_platform_zeroize( ssl->session_negotiate->ticket,
3797 ssl->session_negotiate->ticket_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003798 mbedtls_free( ssl->session_negotiate->ticket );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003799 ssl->session_negotiate->ticket = NULL;
3800 ssl->session_negotiate->ticket_len = 0;
3801
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02003802 if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003803 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02003804 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003805 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3806 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02003807 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003808 }
3809
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003810 memcpy( ticket, msg + 6, ticket_len );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003811
3812 ssl->session_negotiate->ticket = ticket;
3813 ssl->session_negotiate->ticket_len = ticket_len;
3814 ssl->session_negotiate->ticket_lifetime = lifetime;
3815
3816 /*
3817 * RFC 5077 section 3.4:
3818 * "If the client receives a session ticket from the server, then it
3819 * discards any Session ID that was sent in the ServerHello."
3820 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003821 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02003822 ssl->session_negotiate->id_len = 0;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003823
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003824 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003825
3826 return( 0 );
3827}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003828#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003829
Paul Bakker5121ce52009-01-03 21:22:43 +00003830/*
Paul Bakker1961b702013-01-25 14:49:24 +01003831 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00003832 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003833int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003834{
3835 int ret = 0;
3836
Manuel Pégourié-Gonnarddba460f2015-06-24 22:59:30 +02003837 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003838 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003839
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003840 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
Paul Bakker1961b702013-01-25 14:49:24 +01003841
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003842 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
Paul Bakker1961b702013-01-25 14:49:24 +01003843 return( ret );
3844
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003845#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02003846 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003847 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003848 {
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003849 if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003850 return( ret );
3851 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003852#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003853
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003854 /* Change state now, so that it is right in mbedtls_ssl_read_record(), used
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003855 * by DTLS for dropping out-of-sequence ChangeCipherSpec records */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003856#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3857 if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003858 ssl->handshake->new_session_ticket != 0 )
3859 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003860 ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003861 }
3862#endif
3863
Paul Bakker1961b702013-01-25 14:49:24 +01003864 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00003865 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003866 case MBEDTLS_SSL_HELLO_REQUEST:
3867 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00003868 break;
3869
Paul Bakker1961b702013-01-25 14:49:24 +01003870 /*
3871 * ==> ClientHello
3872 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003873 case MBEDTLS_SSL_CLIENT_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01003874 ret = ssl_write_client_hello( ssl );
3875 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003876
Paul Bakker1961b702013-01-25 14:49:24 +01003877 /*
3878 * <== ServerHello
3879 * Certificate
3880 * ( ServerKeyExchange )
3881 * ( CertificateRequest )
3882 * ServerHelloDone
3883 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003884 case MBEDTLS_SSL_SERVER_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01003885 ret = ssl_parse_server_hello( ssl );
3886 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003887
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003888 case MBEDTLS_SSL_SERVER_CERTIFICATE:
3889 ret = mbedtls_ssl_parse_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003890 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003891
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003892 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01003893 ret = ssl_parse_server_key_exchange( ssl );
3894 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003895
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003896 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Paul Bakker1961b702013-01-25 14:49:24 +01003897 ret = ssl_parse_certificate_request( ssl );
3898 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003899
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003900 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Paul Bakker1961b702013-01-25 14:49:24 +01003901 ret = ssl_parse_server_hello_done( ssl );
3902 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003903
Paul Bakker1961b702013-01-25 14:49:24 +01003904 /*
3905 * ==> ( Certificate/Alert )
3906 * ClientKeyExchange
3907 * ( CertificateVerify )
3908 * ChangeCipherSpec
3909 * Finished
3910 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003911 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
3912 ret = mbedtls_ssl_write_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003913 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003914
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003915 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01003916 ret = ssl_write_client_key_exchange( ssl );
3917 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003918
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003919 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Paul Bakker1961b702013-01-25 14:49:24 +01003920 ret = ssl_write_certificate_verify( ssl );
3921 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003922
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003923 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
3924 ret = mbedtls_ssl_write_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003925 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003926
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003927 case MBEDTLS_SSL_CLIENT_FINISHED:
3928 ret = mbedtls_ssl_write_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003929 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003930
Paul Bakker1961b702013-01-25 14:49:24 +01003931 /*
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003932 * <== ( NewSessionTicket )
3933 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01003934 * Finished
3935 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003936#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3937 case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003938 ret = ssl_parse_new_session_ticket( ssl );
3939 break;
Paul Bakkera503a632013-08-14 13:48:06 +02003940#endif
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003941
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003942 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
3943 ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003944 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003945
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003946 case MBEDTLS_SSL_SERVER_FINISHED:
3947 ret = mbedtls_ssl_parse_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003948 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003949
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003950 case MBEDTLS_SSL_FLUSH_BUFFERS:
3951 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
3952 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01003953 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003954
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003955 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
3956 mbedtls_ssl_handshake_wrapup( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003957 break;
Paul Bakker48916f92012-09-16 19:57:18 +00003958
Paul Bakker1961b702013-01-25 14:49:24 +01003959 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003960 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
3961 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker1961b702013-01-25 14:49:24 +01003962 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003963
3964 return( ret );
3965}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003966#endif /* MBEDTLS_SSL_CLI_C */