blob: ae1c400db0ca4521ff6692906946afd04f060156 [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
Teppo Järvelin4009d8f2019-08-19 14:48:09 +030054#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && !defined(MBEDTLS_X509_REMOVE_HOSTNAME_VERIFICATION)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055static 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}
Teppo Järvelin4009d8f2019-08-19 14:48:09 +0300122#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION && !MBEDTLS_X509_REMOVE_HOSTNAME_VERIFICATION */
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é-Gonnard2cf5a7c2015-04-08 12:49:31 +0200176#if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5bfd9682014-06-24 15:18:11 +0200177 unsigned char *sig_alg_list = buf + 6;
178#endif
Paul Bakkerd3edc862013-03-20 16:07:17 +0100179
180 *olen = 0;
181
Hanno Beckere965bd32019-06-12 14:04:34 +0100182 if( mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) !=
183 MBEDTLS_SSL_MINOR_VERSION_3 )
184 {
Paul Bakkerd3edc862013-03-20 16:07:17 +0100185 return;
Hanno Beckere965bd32019-06-12 14:04:34 +0100186 }
Paul Bakkerd3edc862013-03-20 16:07:17 +0100187
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200188 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100189
Hanno Beckerf1bc9e12019-06-19 16:23:21 +0100190 MBEDTLS_SSL_BEGIN_FOR_EACH_SIG_HASH_TLS( hash )
191 ((void) hash);
Simon Butchered997662015-09-28 02:14:30 +0100192#if defined(MBEDTLS_ECDSA_C)
Hanno Beckerf1bc9e12019-06-19 16:23:21 +0100193 sig_alg_len += 2;
Simon Butchered997662015-09-28 02:14:30 +0100194#endif
195#if defined(MBEDTLS_RSA_C)
Hanno Beckerf1bc9e12019-06-19 16:23:21 +0100196 sig_alg_len += 2;
Simon Butchered997662015-09-28 02:14:30 +0100197#endif
Hanno Beckerf1bc9e12019-06-19 16:23:21 +0100198 MBEDTLS_SSL_END_FOR_EACH_SIG_HASH_TLS
Simon Butchered997662015-09-28 02:14:30 +0100199
Simon Butcher0fc94e92015-09-28 20:52:04 +0100200 if( end < p || (size_t)( end - p ) < sig_alg_len + 6 )
Simon Butchered997662015-09-28 02:14:30 +0100201 {
202 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
203 return;
204 }
205
Paul Bakkerd3edc862013-03-20 16:07:17 +0100206 /*
207 * Prepare signature_algorithms extension (TLS 1.2)
208 */
Simon Butchered997662015-09-28 02:14:30 +0100209 sig_alg_len = 0;
210
Hanno Beckerf1bc9e12019-06-19 16:23:21 +0100211 MBEDTLS_SSL_BEGIN_FOR_EACH_SIG_HASH_TLS( hash )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200212#if defined(MBEDTLS_ECDSA_C)
Hanno Beckerf1bc9e12019-06-19 16:23:21 +0100213 sig_alg_list[sig_alg_len++] = hash;
214 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA;
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200215#endif
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200216#if defined(MBEDTLS_RSA_C)
Hanno Beckerf1bc9e12019-06-19 16:23:21 +0100217 sig_alg_list[sig_alg_len++] = hash;
218 sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA;
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200219#endif
Hanno Beckerf1bc9e12019-06-19 16:23:21 +0100220 MBEDTLS_SSL_END_FOR_EACH_SIG_HASH_TLS
Paul Bakkerd3edc862013-03-20 16:07:17 +0100221
222 /*
223 * enum {
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +0200224 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
225 * sha512(6), (255)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100226 * } HashAlgorithm;
227 *
228 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
229 * SignatureAlgorithm;
230 *
231 * struct {
232 * HashAlgorithm hash;
233 * SignatureAlgorithm signature;
234 * } SignatureAndHashAlgorithm;
235 *
236 * SignatureAndHashAlgorithm
237 * supported_signature_algorithms<2..2^16-2>;
238 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200239 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
240 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100241
242 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
243 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
244
245 *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
246 *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
247
Paul Bakkerd3edc862013-03-20 16:07:17 +0100248 *olen = 6 + sig_alg_len;
249}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200250#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
251 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100252
Jarno Lamsae12aafb2019-04-04 18:32:56 +0300253#if defined(MBEDTLS_ECDH_C) || \
254 defined(MBEDTLS_ECDSA_C) || \
255 defined(MBEDTLS_USE_TINYCRYPT) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100256 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Beckera4a9c692019-06-18 16:55:47 +0100257static size_t ssl_get_ec_curve_list_length( mbedtls_ssl_context *ssl )
258{
259 size_t ec_list_len = 0;
260
261 MBEDTLS_SSL_BEGIN_FOR_EACH_SUPPORTED_EC_TLS_ID( tls_id )
262 ((void) tls_id);
263 ec_list_len++;
264 MBEDTLS_SSL_END_FOR_EACH_SUPPORTED_EC_TLS_ID
265
266 return( ec_list_len );
267}
268
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200269static void ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,
Paul Bakkerd3edc862013-03-20 16:07:17 +0100270 unsigned char *buf,
271 size_t *olen )
272{
273 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000274 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100275 size_t elliptic_curve_len = 0;
276
277 *olen = 0;
278
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200279 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100280
Hanno Beckera4a9c692019-06-18 16:55:47 +0100281 /* Each elliptic curve is encoded in 2 bytes. */
282 elliptic_curve_len = 2 * ssl_get_ec_curve_list_length( ssl );
283 if( elliptic_curve_len == 0 )
284 return;
Simon Butchered997662015-09-28 02:14:30 +0100285
Simon Butcher0fc94e92015-09-28 20:52:04 +0100286 if( end < p || (size_t)( end - p ) < 6 + elliptic_curve_len )
Simon Butchered997662015-09-28 02:14:30 +0100287 {
288 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
289 return;
290 }
291
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200292 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
293 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100294
295 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
296 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
297
298 *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
299 *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
300
Hanno Becker7decea92019-06-19 12:59:24 +0100301 MBEDTLS_SSL_BEGIN_FOR_EACH_SUPPORTED_EC_TLS_ID( tls_id )
302 *p++ = tls_id >> 8;
303 *p++ = tls_id & 0xFF;
304 MBEDTLS_SSL_END_FOR_EACH_SUPPORTED_EC_TLS_ID
305
Paul Bakkerd3edc862013-03-20 16:07:17 +0100306 *olen = 6 + elliptic_curve_len;
307}
308
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
Paul Bakkerd3edc862013-03-20 16:07:17 +0100310 unsigned char *buf,
311 size_t *olen )
312{
313 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000314 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100315
316 *olen = 0;
317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200318 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100319
Simon Butcher0fc94e92015-09-28 20:52:04 +0100320 if( end < p || (size_t)( end - p ) < 6 )
Simon Butchered997662015-09-28 02:14:30 +0100321 {
322 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
323 return;
324 }
325
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200326 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
327 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100328
329 *p++ = 0x00;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100330 *p++ = 2;
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200331
332 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200333 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100334
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200335 *olen = 6;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100336}
Jarno Lamsae12aafb2019-04-04 18:32:56 +0300337#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_USE_TINYCRYPT ||
Robert Cragieae8535d2015-10-06 17:11:18 +0100338 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100339
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200340#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200341static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
342 unsigned char *buf,
343 size_t *olen )
344{
345 int ret;
346 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000347 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200348 size_t kkpp_len;
349
350 *olen = 0;
351
352 /* Skip costly extension if we can't use EC J-PAKE anyway */
353 if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
354 return;
355
356 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding ecjpake_kkpp extension" ) );
357
358 if( end - p < 4 )
359 {
360 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
361 return;
362 }
363
364 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
365 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
366
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200367 /*
368 * We may need to send ClientHello multiple times for Hello verification.
369 * We don't want to compute fresh values every time (both for performance
370 * and consistency reasons), so cache the extension content.
371 */
372 if( ssl->handshake->ecjpake_cache == NULL ||
373 ssl->handshake->ecjpake_cache_len == 0 )
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200374 {
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200375 MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) );
376
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +0200377 ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
378 p + 2, end - p - 2, &kkpp_len,
Hanno Beckerece325c2019-06-13 15:39:27 +0100379 mbedtls_ssl_conf_get_frng( ssl->conf ),
Hanno Becker9a122432019-07-23 13:24:02 +0100380 mbedtls_ssl_conf_get_prng( ssl->conf ) );
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +0200381 if( ret != 0 )
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200382 {
383 MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret );
384 return;
385 }
386
387 ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len );
388 if( ssl->handshake->ecjpake_cache == NULL )
389 {
390 MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) );
391 return;
392 }
393
394 memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len );
395 ssl->handshake->ecjpake_cache_len = kkpp_len;
396 }
397 else
398 {
399 MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) );
400
401 kkpp_len = ssl->handshake->ecjpake_cache_len;
402
403 if( (size_t)( end - p - 2 ) < kkpp_len )
404 {
405 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
406 return;
407 }
408
409 memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len );
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200410 }
411
412 *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
413 *p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
414
415 *olen = kkpp_len + 4;
416}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200417#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000418
Hanno Beckera5a2b082019-05-15 14:03:01 +0100419#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker39ec5252019-04-25 16:55:15 +0100420static void ssl_write_cid_ext( mbedtls_ssl_context *ssl,
421 unsigned char *buf,
422 size_t *olen )
423{
424 unsigned char *p = buf;
425 size_t ext_len;
426 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
427
428 /*
Hanno Becker3cdf8fe2019-05-15 10:26:32 +0100429 * Quoting draft-ietf-tls-dtls-connection-id-05
430 * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
Hanno Becker39ec5252019-04-25 16:55:15 +0100431 *
432 * struct {
433 * opaque cid<0..2^8-1>;
434 * } ConnectionId;
435 */
436
437 *olen = 0;
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +0200438 if( MBEDTLS_SSL_TRANSPORT_IS_TLS( ssl->conf->transport ) ||
Hanno Becker39ec5252019-04-25 16:55:15 +0100439 ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED )
440 {
441 return;
442 }
443 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding CID extension" ) );
444
445 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
446 * which is at most 255, so the increment cannot overflow. */
447 if( end < p || (size_t)( end - p ) < (unsigned)( ssl->own_cid_len + 5 ) )
448 {
449 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
450 return;
451 }
452
453 /* Add extension ID + size */
454 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_CID >> 8 ) & 0xFF );
455 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_CID ) & 0xFF );
456 ext_len = (size_t) ssl->own_cid_len + 1;
457 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
458 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
459
460 *p++ = (uint8_t) ssl->own_cid_len;
461 memcpy( p, ssl->own_cid, ssl->own_cid_len );
462
463 *olen = ssl->own_cid_len + 5;
464}
Hanno Beckera5a2b082019-05-15 14:03:01 +0100465#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker39ec5252019-04-25 16:55:15 +0100466
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200467#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
468static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200469 unsigned char *buf,
470 size_t *olen )
471{
472 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000473 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200474
Simon Butcher0fc94e92015-09-28 20:52:04 +0100475 *olen = 0;
476
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200477 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) {
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200478 return;
479 }
480
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200481 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200482
Simon Butcher0fc94e92015-09-28 20:52:04 +0100483 if( end < p || (size_t)( end - p ) < 5 )
Simon Butchered997662015-09-28 02:14:30 +0100484 {
485 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
486 return;
487 }
488
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200489 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
490 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200491
492 *p++ = 0x00;
493 *p++ = 1;
494
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200495 *p++ = ssl->conf->mfl_code;
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200496
497 *olen = 5;
498}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200499#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200500
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200501#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
502static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200503 unsigned char *buf, size_t *olen )
504{
505 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000506 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200507
Simon Butcher0fc94e92015-09-28 20:52:04 +0100508 *olen = 0;
509
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200510 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200511 {
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200512 return;
513 }
514
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200515 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200516
Simon Butcher0fc94e92015-09-28 20:52:04 +0100517 if( end < p || (size_t)( end - p ) < 4 )
Simon Butchered997662015-09-28 02:14:30 +0100518 {
519 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
520 return;
521 }
522
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200523 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
524 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200525
526 *p++ = 0x00;
527 *p++ = 0x00;
528
529 *olen = 4;
530}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200531#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200532
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200533#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
534static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100535 unsigned char *buf, size_t *olen )
536{
537 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000538 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100539
Simon Butcher0fc94e92015-09-28 20:52:04 +0100540 *olen = 0;
541
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200542 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
Hanno Beckere965bd32019-06-12 14:04:34 +0100543 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ==
544 MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100545 {
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100546 return;
547 }
548
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200549 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding encrypt_then_mac "
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100550 "extension" ) );
551
Simon Butcher0fc94e92015-09-28 20:52:04 +0100552 if( end < p || (size_t)( end - p ) < 4 )
Simon Butchered997662015-09-28 02:14:30 +0100553 {
554 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
555 return;
556 }
557
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200558 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
559 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100560
561 *p++ = 0x00;
562 *p++ = 0x00;
563
564 *olen = 4;
565}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200566#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100567
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200568#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
569static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200570 unsigned char *buf, size_t *olen )
571{
572 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000573 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200574
Simon Butcher0fc94e92015-09-28 20:52:04 +0100575 *olen = 0;
576
Hanno Beckeraabbb582019-06-11 13:43:27 +0100577 if( mbedtls_ssl_conf_get_ems( ssl->conf ) ==
578 MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
Hanno Beckere965bd32019-06-12 14:04:34 +0100579 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ==
580 MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200581 {
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200582 return;
583 }
584
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200585 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding extended_master_secret "
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200586 "extension" ) );
587
Simon Butcher0fc94e92015-09-28 20:52:04 +0100588 if( end < p || (size_t)( end - p ) < 4 )
Simon Butchered997662015-09-28 02:14:30 +0100589 {
590 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
591 return;
592 }
593
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200594 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );
595 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200596
597 *p++ = 0x00;
598 *p++ = 0x00;
599
600 *olen = 4;
601}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200602#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200603
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200604#if defined(MBEDTLS_SSL_SESSION_TICKETS)
605static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200606 unsigned char *buf, size_t *olen )
607{
608 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000609 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200610 size_t tlen = ssl->session_negotiate->ticket_len;
611
Simon Butcher0fc94e92015-09-28 20:52:04 +0100612 *olen = 0;
613
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200614 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED )
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200615 {
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200616 return;
617 }
618
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200619 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200620
Simon Butcher0fc94e92015-09-28 20:52:04 +0100621 if( end < p || (size_t)( end - p ) < 4 + tlen )
Simon Butchered997662015-09-28 02:14:30 +0100622 {
623 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
624 return;
625 }
626
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200627 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
628 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200629
630 *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
631 *p++ = (unsigned char)( ( tlen ) & 0xFF );
632
633 *olen = 4;
634
Simon Butchered997662015-09-28 02:14:30 +0100635 if( ssl->session_negotiate->ticket == NULL || tlen == 0 )
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200636 {
637 return;
638 }
639
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200640 MBEDTLS_SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200641
642 memcpy( p, ssl->session_negotiate->ticket, tlen );
643
644 *olen += tlen;
645}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200646#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200647
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200648#if defined(MBEDTLS_SSL_ALPN)
649static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200650 unsigned char *buf, size_t *olen )
651{
652 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +1000653 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Simon Butchered997662015-09-28 02:14:30 +0100654 size_t alpnlen = 0;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200655 const char **cur;
656
Simon Butcher0fc94e92015-09-28 20:52:04 +0100657 *olen = 0;
658
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200659 if( ssl->conf->alpn_list == NULL )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200660 {
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200661 return;
662 }
663
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200664 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200665
Simon Butchered997662015-09-28 02:14:30 +0100666 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
Simon Butcher04799a42015-09-29 00:31:09 +0100667 alpnlen += (unsigned char)( strlen( *cur ) & 0xFF ) + 1;
Simon Butchered997662015-09-28 02:14:30 +0100668
Simon Butcher0fc94e92015-09-28 20:52:04 +0100669 if( end < p || (size_t)( end - p ) < 6 + alpnlen )
Simon Butchered997662015-09-28 02:14:30 +0100670 {
671 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
672 return;
673 }
674
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200675 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );
676 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200677
678 /*
679 * opaque ProtocolName<1..2^8-1>;
680 *
681 * struct {
682 * ProtocolName protocol_name_list<2..2^16-1>
683 * } ProtocolNameList;
684 */
685
686 /* Skip writing extension and list length for now */
687 p += 4;
688
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200689 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200690 {
691 *p = (unsigned char)( strlen( *cur ) & 0xFF );
692 memcpy( p + 1, *cur, *p );
693 p += 1 + *p;
694 }
695
696 *olen = p - buf;
697
698 /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
699 buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
700 buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF );
701
702 /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */
703 buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
704 buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF );
705}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200706#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200707
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200708/*
709 * Generate random bytes for ClientHello
710 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200711static int ssl_generate_random( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200712{
713 int ret;
714 unsigned char *p = ssl->handshake->randbytes;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200715#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +0100716 mbedtls_time_t t;
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200717#endif
718
Manuel Pégourié-Gonnardfb2d2232014-07-22 15:59:14 +0200719 /*
720 * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1)
721 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200722#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +0200723 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) &&
Manuel Pégourié-Gonnardfb2d2232014-07-22 15:59:14 +0200724 ssl->handshake->verify_cookie != NULL )
725 {
726 return( 0 );
727 }
728#endif
729
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200730#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +0100731 t = mbedtls_time( NULL );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200732 *p++ = (unsigned char)( t >> 24 );
733 *p++ = (unsigned char)( t >> 16 );
734 *p++ = (unsigned char)( t >> 8 );
735 *p++ = (unsigned char)( t );
736
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200737 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200738#else
Hanno Beckerece325c2019-06-13 15:39:27 +0100739 if( ( ret = mbedtls_ssl_conf_get_frng( ssl->conf )
Hanno Becker9a122432019-07-23 13:24:02 +0100740 ( mbedtls_ssl_conf_get_prng( ssl->conf ), p, 4 ) ) != 0 )
Hanno Beckerece325c2019-06-13 15:39:27 +0100741 {
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200742 return( ret );
Hanno Beckerece325c2019-06-13 15:39:27 +0100743 }
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200744
745 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200746#endif /* MBEDTLS_HAVE_TIME */
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200747
Hanno Beckerece325c2019-06-13 15:39:27 +0100748 if( ( ret = mbedtls_ssl_conf_get_frng( ssl->conf )
Hanno Becker9a122432019-07-23 13:24:02 +0100749 ( mbedtls_ssl_conf_get_prng( ssl->conf ), p, 28 ) ) != 0 )
Hanno Beckerece325c2019-06-13 15:39:27 +0100750 {
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200751 return( ret );
Hanno Beckerece325c2019-06-13 15:39:27 +0100752 }
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200753
754 return( 0 );
755}
756
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100757/**
758 * \brief Validate cipher suite against config in SSL context.
759 *
760 * \param suite_info cipher suite to validate
761 * \param ssl SSL context
Andrzej Kurek03bac442018-04-25 05:06:07 -0400762 * \param min_minor_ver Minimal minor version to accept a cipher suite
763 * \param max_minor_ver Maximal minor version to accept a cipher suite
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100764 *
765 * \return 0 if valid, else 1
766 */
Hanno Becker473f98f2019-06-26 10:27:32 +0100767static int ssl_validate_ciphersuite( mbedtls_ssl_ciphersuite_handle_t suite_info,
Andrzej Kurek03bac442018-04-25 05:06:07 -0400768 const mbedtls_ssl_context * ssl,
769 int min_minor_ver, int max_minor_ver )
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100770{
Andrzej Kurek03bac442018-04-25 05:06:07 -0400771 (void) ssl;
Hanno Becker473f98f2019-06-26 10:27:32 +0100772 if( suite_info == MBEDTLS_SSL_CIPHERSUITE_INVALID_HANDLE )
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100773 return( 1 );
774
Hanno Becker7bcf2b52019-07-26 09:02:40 +0100775 if( mbedtls_ssl_ver_gt( mbedtls_ssl_suite_get_min_minor_ver( suite_info ),
776 max_minor_ver ) ||
777 mbedtls_ssl_ver_lt( mbedtls_ssl_suite_get_max_minor_ver( suite_info ),
778 min_minor_ver ) )
Hanno Becker473f98f2019-06-26 10:27:32 +0100779 {
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100780 return( 1 );
Hanno Becker473f98f2019-06-26 10:27:32 +0100781 }
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100782
783#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +0200784 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) &&
Hanno Becker473f98f2019-06-26 10:27:32 +0100785 ( mbedtls_ssl_suite_get_flags( suite_info ) &
786 MBEDTLS_CIPHERSUITE_NODTLS ) != 0 )
787 {
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100788 return( 1 );
Hanno Becker473f98f2019-06-26 10:27:32 +0100789 }
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100790#endif
791
792#if defined(MBEDTLS_ARC4_C)
793 if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&
Hanno Becker473f98f2019-06-26 10:27:32 +0100794 mbedtls_ssl_suite_get_cipher( suite_info ) == MBEDTLS_CIPHER_ARC4_128 )
795 {
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100796 return( 1 );
Hanno Becker473f98f2019-06-26 10:27:32 +0100797 }
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100798#endif
799
800#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +0100801 if( mbedtls_ssl_suite_get_key_exchange( suite_info ) ==
802 MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
803 mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
804 {
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100805 return( 1 );
Hanno Becker473f98f2019-06-26 10:27:32 +0100806 }
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +0100807#endif
808
809 return( 0 );
810}
811
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200812static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +0000813{
Paul Bakker23986e52011-04-24 08:57:21 +0000814 int ret;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100815 size_t i, n, olen, ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000816 unsigned char *buf;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200817 unsigned char *p, *q;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +0200818 unsigned char offer_compress;
Ron Eldor755bb6a2018-02-14 19:30:48 +0200819#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
820 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
821 int uses_ec = 0;
822#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000823
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200824 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000825
Hanno Beckerece325c2019-06-13 15:39:27 +0100826 if( mbedtls_ssl_conf_get_frng( ssl->conf ) == NULL )
Paul Bakkera9a028e2013-11-21 17:31:06 +0100827 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200828 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
829 return( MBEDTLS_ERR_SSL_NO_RNG );
Paul Bakkera9a028e2013-11-21 17:31:06 +0100830 }
831
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +0200832 if( mbedtls_ssl_get_renego_status( ssl ) == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +0000833 {
Hanno Becker381eaa52019-06-12 14:43:01 +0100834#if !defined(MBEDTLS_SSL_CONF_FIXED_MAJOR_VER)
Hanno Beckere965bd32019-06-12 14:04:34 +0100835 ssl->major_ver = mbedtls_ssl_conf_get_min_major_ver( ssl->conf );
Hanno Becker381eaa52019-06-12 14:43:01 +0100836#endif /* !MBEDTLS_SSL_CONF_FIXED_MAJOR_VER */
837#if !defined(MBEDTLS_SSL_CONF_FIXED_MINOR_VER)
Hanno Beckere965bd32019-06-12 14:04:34 +0100838 ssl->minor_ver = mbedtls_ssl_conf_get_min_minor_ver( ssl->conf );
Hanno Becker381eaa52019-06-12 14:43:01 +0100839#endif /* !MBEDTLS_SSL_CONF_FIXED_MINOR_VER */
Paul Bakker48916f92012-09-16 19:57:18 +0000840 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000841
Hanno Beckere965bd32019-06-12 14:04:34 +0100842 if( mbedtls_ssl_conf_get_max_major_ver( ssl->conf ) == 0 )
Paul Bakker490ecc82011-10-06 13:04:09 +0000843 {
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +0200844 MBEDTLS_SSL_DEBUG_MSG( 1, ( "configured max major version is invalid, "
845 "consider using mbedtls_ssl_config_defaults()" ) );
846 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker490ecc82011-10-06 13:04:09 +0000847 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000848
849 /*
850 * 0 . 0 handshake type
851 * 1 . 3 handshake length
852 * 4 . 5 highest version supported
853 * 6 . 9 current UNIX time
854 * 10 . 37 random bytes
855 */
856 buf = ssl->out_msg;
857 p = buf + 4;
858
Hanno Beckere965bd32019-06-12 14:04:34 +0100859 mbedtls_ssl_write_version( mbedtls_ssl_conf_get_max_major_ver( ssl->conf ),
860 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ),
861 ssl->conf->transport, p );
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +0100862 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000863
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200864 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
Paul Bakker5121ce52009-01-03 21:22:43 +0000865 buf[4], buf[5] ) );
866
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200867 if( ( ret = ssl_generate_random( ssl ) ) != 0 )
868 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200869 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200870 return( ret );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200871 }
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200872
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200873 memcpy( p, ssl->handshake->randbytes, 32 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200874 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", p, 32 );
Manuel Pégourié-Gonnardb760f002014-07-22 15:53:27 +0200875 p += 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000876
877 /*
878 * 38 . 38 session id length
879 * 39 . 39+n session id
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100880 * 39+n . 39+n DTLS only: cookie length (1 byte)
881 * 40+n . .. DTSL only: cookie
882 * .. . .. ciphersuitelist length (2 bytes)
883 * .. . .. ciphersuitelist
884 * .. . .. compression methods length (1 byte)
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000885 * .. . .. compression methods
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100886 * .. . .. extensions length (2 bytes)
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000887 * .. . .. extensions
Paul Bakker5121ce52009-01-03 21:22:43 +0000888 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000889
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +0200890 /*
891 * We'll write a session of non-zero length if resumption was requested
892 * by the user, we're not renegotiating, and the session ID is of
893 * appropriate length. Otherwise make the length 0 (for now, see next code
894 * block for behaviour with tickets).
895 */
896 if( mbedtls_ssl_handshake_get_resume( ssl->handshake ) == 0 ||
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +0200897 mbedtls_ssl_get_renego_status( ssl ) != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +0200898 ssl->session_negotiate->id_len < 16 ||
899 ssl->session_negotiate->id_len > 32 )
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200900 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000901 n = 0;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200902 }
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +0200903 else
904 {
905 n = ssl->session_negotiate->id_len;
906 }
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200907
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200908#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200909 /*
910 * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
911 * generate and include a Session ID in the TLS ClientHello."
912 */
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +0200913 if( mbedtls_ssl_get_renego_status( ssl ) == MBEDTLS_SSL_INITIAL_HANDSHAKE &&
914 ssl->session_negotiate->ticket != NULL &&
915 ssl->session_negotiate->ticket_len != 0 )
Manuel Pégourié-Gonnardd2b35ec2015-03-10 11:40:43 +0000916 {
Hanno Beckerece325c2019-06-13 15:39:27 +0100917 ret = mbedtls_ssl_conf_get_frng( ssl->conf )
Hanno Becker9a122432019-07-23 13:24:02 +0100918 ( mbedtls_ssl_conf_get_prng( ssl->conf ), ssl->session_negotiate->id, 32 );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200919
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +0200920 if( ret != 0 )
921 return( ret );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200922
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +0200923 ssl->session_negotiate->id_len = n = 32;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200924 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200925#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Paul Bakker5121ce52009-01-03 21:22:43 +0000926
927 *p++ = (unsigned char) n;
928
929 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +0000930 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000931
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200932 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
933 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000934
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100935 /*
936 * DTLS cookie
937 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200938#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +0200939 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) )
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100940 {
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200941 if( ssl->handshake->verify_cookie == NULL )
942 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200943 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no verify cookie to send" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200944 *p++ = 0;
945 }
946 else
947 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200948 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +0200949 ssl->handshake->verify_cookie,
950 ssl->handshake->verify_cookie_len );
951
952 *p++ = ssl->handshake->verify_cookie_len;
953 memcpy( p, ssl->handshake->verify_cookie,
954 ssl->handshake->verify_cookie_len );
955 p += ssl->handshake->verify_cookie_len;
956 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100957 }
958#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000959
Paul Bakker48916f92012-09-16 19:57:18 +0000960 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100961 * Ciphersuite list
Paul Bakker48916f92012-09-16 19:57:18 +0000962 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +0100963
964 /* Skip writing ciphersuite length for now */
965 n = 0;
966 q = p;
967 p += 2;
968
Hanno Becker14990272019-06-26 11:47:15 +0100969 MBEDTLS_SSL_BEGIN_FOR_EACH_CIPHERSUITE( ssl,
Hanno Becker981f81d2019-07-19 16:10:49 +0100970 mbedtls_ssl_get_minor_ver( ssl ),
Hanno Becker14990272019-06-26 11:47:15 +0100971 ciphersuite_info )
Paul Bakker5121ce52009-01-03 21:22:43 +0000972 {
Andrzej Kurek03bac442018-04-25 05:06:07 -0400973 if( ssl_validate_ciphersuite( ciphersuite_info, ssl,
Hanno Beckere965bd32019-06-12 14:04:34 +0100974 mbedtls_ssl_conf_get_min_minor_ver( ssl->conf ),
975 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ) != 0 )
Hanno Becker14990272019-06-26 11:47:15 +0100976 {
Hanno Beckerf4d6b492019-07-02 17:13:14 +0100977 continue;
Hanno Becker14990272019-06-26 11:47:15 +0100978 }
Paul Bakker2fbefde2013-06-29 16:01:15 +0200979
Manuel Pégourié-Gonnard60884a12015-09-16 11:13:41 +0200980 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x",
Hanno Becker473f98f2019-06-26 10:27:32 +0100981 mbedtls_ssl_suite_get_id( ciphersuite_info ) ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000982
Ron Eldor755bb6a2018-02-14 19:30:48 +0200983#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
984 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
985 uses_ec |= mbedtls_ssl_ciphersuite_uses_ec( ciphersuite_info );
986#endif
987
Paul Bakker2fbefde2013-06-29 16:01:15 +0200988 n++;
Hanno Becker473f98f2019-06-26 10:27:32 +0100989 *p++ = (unsigned char)(
990 mbedtls_ssl_suite_get_id( ciphersuite_info ) >> 8 );
991 *p++ = (unsigned char)(
992 mbedtls_ssl_suite_get_id( ciphersuite_info ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000993 }
Hanno Becker14990272019-06-26 11:47:15 +0100994 MBEDTLS_SSL_END_FOR_EACH_CIPHERSUITE
Paul Bakker5121ce52009-01-03 21:22:43 +0000995
Ron Eldor4a2fb4c2017-09-10 17:03:50 +0300996 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites (excluding SCSVs)", n ) );
Ron Eldor714785d2017-08-28 13:55:55 +0300997
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +0000998 /*
999 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1000 */
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +02001001 if( mbedtls_ssl_get_renego_status( ssl ) == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001002 {
Ron Eldor4a2fb4c2017-09-10 17:03:50 +03001003 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding EMPTY_RENEGOTIATION_INFO_SCSV" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001004 *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
1005 *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO );
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +00001006 n++;
1007 }
1008
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001009 /* Some versions of OpenSSL don't handle it correctly if not at end */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001010#if defined(MBEDTLS_SSL_FALLBACK_SCSV)
Manuel Pégourié-Gonnard684b0592015-05-06 09:27:31 +01001011 if( ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK )
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001012 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001013 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding FALLBACK_SCSV" ) );
1014 *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 );
1015 *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE );
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02001016 n++;
1017 }
1018#endif
1019
Paul Bakker2fbefde2013-06-29 16:01:15 +02001020 *q++ = (unsigned char)( n >> 7 );
1021 *q++ = (unsigned char)( n << 1 );
1022
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001023#if defined(MBEDTLS_ZLIB_SUPPORT)
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001024 offer_compress = 1;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001025#else
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001026 offer_compress = 0;
1027#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001028
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001029 /*
Johannes H4e5d23f2018-01-06 09:46:57 +01001030 * We don't support compression with DTLS right now: if many records come
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001031 * in the same datagram, uncompressing one could overwrite the next one.
1032 * We don't want to add complexity for handling that case unless there is
1033 * an actual need for it.
1034 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001035#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02001036 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) )
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001037 offer_compress = 0;
1038#endif
1039
1040 if( offer_compress )
1041 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001042 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
1043 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
1044 MBEDTLS_SSL_COMPRESS_DEFLATE, MBEDTLS_SSL_COMPRESS_NULL ) );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001045
1046 *p++ = 2;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001047 *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE;
1048 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001049 }
1050 else
1051 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001052 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
1053 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d",
1054 MBEDTLS_SSL_COMPRESS_NULL ) );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001055
1056 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001057 *p++ = MBEDTLS_SSL_COMPRESS_NULL;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001058 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001059
Paul Bakkerd3edc862013-03-20 16:07:17 +01001060 // First write extensions, then the total length
1061 //
Teppo Järvelin4009d8f2019-08-19 14:48:09 +03001062#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && !defined(MBEDTLS_X509_REMOVE_HOSTNAME_VERIFICATION)
Paul Bakkerd3edc862013-03-20 16:07:17 +01001063 ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
1064 ext_len += olen;
Paul Bakker0be444a2013-08-27 21:55:01 +02001065#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001066
Hanno Becker40f8b512017-10-12 14:58:55 +01001067 /* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added
1068 * even if MBEDTLS_SSL_RENEGOTIATION is not defined. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001069#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd3edc862013-03-20 16:07:17 +01001070 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
1071 ext_len += olen;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001072#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001073
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001074#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1075 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +01001076 ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
1077 ext_len += olen;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001078#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001079
Jarno Lamsae12aafb2019-04-04 18:32:56 +03001080#if defined(MBEDTLS_ECDH_C) || \
1081 defined(MBEDTLS_ECDSA_C) || \
1082 defined(MBEDTLS_USE_TINYCRYPT) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01001083 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Ron Eldor755bb6a2018-02-14 19:30:48 +02001084 if( uses_ec )
1085 {
1086 ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
1087 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +01001088
Ron Eldor755bb6a2018-02-14 19:30:48 +02001089 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
1090 ext_len += olen;
1091 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001092#endif
1093
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02001094#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +02001095 ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );
1096 ext_len += olen;
1097#endif
1098
Hanno Beckera5a2b082019-05-15 14:03:01 +01001099#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker39ec5252019-04-25 16:55:15 +01001100 ssl_write_cid_ext( ssl, p + 2 + ext_len, &olen );
1101 ext_len += olen;
Hanno Beckera5a2b082019-05-15 14:03:01 +01001102#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker39ec5252019-04-25 16:55:15 +01001103
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001104#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001105 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
1106 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02001107#endif
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001108
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001109#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001110 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
1111 ext_len += olen;
Paul Bakker1f2bc622013-08-15 13:45:55 +02001112#endif
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001114#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001115 ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );
1116 ext_len += olen;
1117#endif
1118
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001119#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001120 ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );
1121 ext_len += olen;
1122#endif
1123
Simon Butcher5624ec82015-09-29 01:06:06 +01001124#if defined(MBEDTLS_SSL_ALPN)
1125 ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001126 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02001127#endif
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001128
Simon Butcher5624ec82015-09-29 01:06:06 +01001129#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1130 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001131 ext_len += olen;
1132#endif
1133
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001134 /* olen unused if all extensions are disabled */
1135 ((void) olen);
1136
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001137 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001138 ext_len ) );
1139
Paul Bakkera7036632014-04-30 10:15:38 +02001140 if( ext_len > 0 )
1141 {
1142 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
1143 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
1144 p += ext_len;
1145 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001146
Paul Bakker5121ce52009-01-03 21:22:43 +00001147 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001148 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
1149 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00001150
1151 ssl->state++;
1152
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001153#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02001154 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001155 mbedtls_ssl_send_flight_completed( ssl );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02001156#endif
1157
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02001158 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001159 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02001160 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001161 return( ret );
1162 }
1163
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02001164#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02001165 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) &&
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02001166 ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
1167 {
1168 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
1169 return( ret );
1170 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01001171#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02001172
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001173 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001174
1175 return( 0 );
1176}
1177
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001178static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001179 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +00001180 size_t len )
1181{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001182#if defined(MBEDTLS_SSL_RENEGOTIATION)
1183 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00001184 {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001185 /* Check verify-data in constant-time. The length OTOH is no secret */
Paul Bakker48916f92012-09-16 19:57:18 +00001186 if( len != 1 + ssl->verify_data_len * 2 ||
1187 buf[0] != ssl->verify_data_len * 2 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001188 mbedtls_ssl_safer_memcmp( buf + 1,
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001189 ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001190 mbedtls_ssl_safer_memcmp( buf + 1 + ssl->verify_data_len,
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01001191 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001192 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001193 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001194 mbedtls_ssl_pend_fatal_alert( ssl,
1195 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001196 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001197 }
1198 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001199 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001200#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001201 {
1202 if( len != 1 || buf[0] != 0x00 )
1203 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001204 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001205 mbedtls_ssl_pend_fatal_alert( ssl,
1206 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001207 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001208 }
1209
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001210 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001211 }
Paul Bakker48916f92012-09-16 19:57:18 +00001212
1213 return( 0 );
1214}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001215
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001216#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1217static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001218 const unsigned char *buf,
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001219 size_t len )
1220{
1221 /*
1222 * server should use the extension only if we did,
1223 * and if so the server's value should match ours (and len is always 1)
1224 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001225 if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ||
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001226 len != 1 ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001227 buf[0] != ssl->conf->mfl_code )
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001228 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001229 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching max fragment length extension" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001230 mbedtls_ssl_pend_fatal_alert( ssl,
1231 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001232 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001233 }
1234
1235 return( 0 );
1236}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001237#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Paul Bakker48916f92012-09-16 19:57:18 +00001238
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001239#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1240static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001241 const unsigned char *buf,
1242 size_t len )
1243{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001244 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ||
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001245 len != 0 )
1246 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001247 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching truncated HMAC extension" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001248 mbedtls_ssl_pend_fatal_alert( ssl,
1249 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001250 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001251 }
1252
1253 ((void) buf);
1254
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001255 ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001256
1257 return( 0 );
1258}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001259#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001260
Hanno Beckera5a2b082019-05-15 14:03:01 +01001261#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker1ba81f62019-04-26 15:37:26 +01001262static int ssl_parse_cid_ext( mbedtls_ssl_context *ssl,
1263 const unsigned char *buf,
1264 size_t len )
1265{
1266 size_t peer_cid_len;
1267
1268 if( /* CID extension only makes sense in DTLS */
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02001269 MBEDTLS_SSL_TRANSPORT_IS_TLS( ssl->conf->transport ) ||
Hanno Becker1ba81f62019-04-26 15:37:26 +01001270 /* The server must only send the CID extension if we have offered it. */
Hanno Becker8f68f872019-05-03 12:46:59 +01001271 ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED )
Hanno Becker1ba81f62019-04-26 15:37:26 +01001272 {
Hanno Becker8f68f872019-05-03 12:46:59 +01001273 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension unexpected" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001274 mbedtls_ssl_pend_fatal_alert( ssl,
1275 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Hanno Becker8f68f872019-05-03 12:46:59 +01001276 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1277 }
1278
1279 if( len == 0 )
1280 {
1281 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001282 mbedtls_ssl_pend_fatal_alert( ssl,
1283 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Hanno Becker1ba81f62019-04-26 15:37:26 +01001284 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1285 }
1286
1287 peer_cid_len = *buf++;
1288 len--;
1289
1290 if( peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX )
1291 {
Hanno Becker8f68f872019-05-03 12:46:59 +01001292 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001293 mbedtls_ssl_pend_fatal_alert( ssl,
1294 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Hanno Becker1ba81f62019-04-26 15:37:26 +01001295 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1296 }
1297
1298 if( len != peer_cid_len )
1299 {
Hanno Becker8f68f872019-05-03 12:46:59 +01001300 MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001301 mbedtls_ssl_pend_fatal_alert( ssl,
1302 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Hanno Becker1ba81f62019-04-26 15:37:26 +01001303 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1304 }
1305
Hanno Beckerf885d3b2019-05-03 12:47:49 +01001306 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker1ba81f62019-04-26 15:37:26 +01001307 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
1308 memcpy( ssl->handshake->peer_cid, buf, peer_cid_len );
1309
1310 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use of CID extension negotiated" ) );
1311 MBEDTLS_SSL_DEBUG_BUF( 3, "Server CID", buf, peer_cid_len );
1312
Hanno Becker1ba81f62019-04-26 15:37:26 +01001313 return( 0 );
1314}
Hanno Beckera5a2b082019-05-15 14:03:01 +01001315#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker1ba81f62019-04-26 15:37:26 +01001316
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001317#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1318static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001319 const unsigned char *buf,
1320 size_t len )
1321{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001322 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
Hanno Becker2881d802019-05-22 14:44:53 +01001323 mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_0 ||
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001324 len != 0 )
1325 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001326 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching encrypt-then-MAC extension" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001327 mbedtls_ssl_pend_fatal_alert( ssl,
1328 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001329 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001330 }
1331
1332 ((void) buf);
1333
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001334 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001335
1336 return( 0 );
1337}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001338#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001339
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001340#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1341static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001342 const unsigned char *buf,
1343 size_t len )
1344{
Hanno Beckeraabbb582019-06-11 13:43:27 +01001345 if( mbedtls_ssl_conf_get_ems( ssl->conf ) ==
1346 MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
Hanno Becker2881d802019-05-22 14:44:53 +01001347 mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_0 ||
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001348 len != 0 )
1349 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001350 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching extended master secret extension" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001351 mbedtls_ssl_pend_fatal_alert( ssl,
1352 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001353 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001354 }
1355
1356 ((void) buf);
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001357 return( 0 );
1358}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001359#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001361#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1362static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001363 const unsigned char *buf,
1364 size_t len )
1365{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001366 if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ||
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02001367 len != 0 )
1368 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001369 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching session ticket extension" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001370 mbedtls_ssl_pend_fatal_alert( ssl,
1371 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001372 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02001373 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001374
1375 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02001376
1377 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001378
1379 return( 0 );
1380}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001381#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001382
Jarno Lamsae12aafb2019-04-04 18:32:56 +03001383#if defined(MBEDTLS_ECDH_C) || \
1384 defined(MBEDTLS_ECDSA_C) || \
1385 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) || \
1386 defined(MBEDTLS_USE_TINYCRYPT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001387static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001388 const unsigned char *buf,
1389 size_t len )
1390{
1391 size_t list_size;
1392 const unsigned char *p;
1393
Philippe Antoine747fd532018-05-30 09:13:21 +02001394 if( len == 0 || (size_t)( buf[0] + 1 ) != len )
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001395 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001396 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001397 mbedtls_ssl_pend_fatal_alert( ssl,
1398 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001399 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001400 }
Philippe Antoine747fd532018-05-30 09:13:21 +02001401 list_size = buf[0];
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001402
Manuel Pégourié-Gonnardfd35af12014-06-23 14:10:13 +02001403 p = buf + 1;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001404 while( list_size > 0 )
1405 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001406 if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
1407 p[0] == MBEDTLS_ECP_PF_COMPRESSED )
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001408 {
Hanno Becker975b9ee2019-07-24 10:09:27 +01001409#if defined(MBEDTLS_ECDH_C)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +02001410 ssl->handshake->ecdh_ctx.point_format = p[0];
Gilles Peskine064a85c2017-05-10 10:46:40 +02001411#endif
Robert Cragieae8535d2015-10-06 17:11:18 +01001412#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Robert Cragie136884c2015-10-02 13:34:31 +01001413 ssl->handshake->ecjpake_ctx.point_format = p[0];
1414#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001415 MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001416 return( 0 );
1417 }
1418
1419 list_size--;
1420 p++;
1421 }
1422
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001423 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001424 mbedtls_ssl_pend_fatal_alert( ssl,
1425 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001426 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001427}
Jarno Lamsae12aafb2019-04-04 18:32:56 +03001428#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_USE_TINYCRYPT ||
Robert Cragieae8535d2015-10-06 17:11:18 +01001429 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001430
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001431#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1432static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
1433 const unsigned char *buf,
1434 size_t len )
1435{
1436 int ret;
1437
Hanno Becker473f98f2019-06-26 10:27:32 +01001438 if( mbedtls_ssl_suite_get_key_exchange(
Hanno Beckerdf645962019-06-26 13:02:22 +01001439 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake ) )
1440 != MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001441 {
1442 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
1443 return( 0 );
1444 }
1445
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +02001446 /* If we got here, we no longer need our cached extension */
1447 mbedtls_free( ssl->handshake->ecjpake_cache );
1448 ssl->handshake->ecjpake_cache = NULL;
1449 ssl->handshake->ecjpake_cache_len = 0;
1450
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001451 if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
1452 buf, len ) ) != 0 )
1453 {
1454 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
Hanno Beckerde62da92019-07-24 13:23:50 +01001455 mbedtls_ssl_pend_fatal_alert( ssl,
1456 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001457 return( ret );
1458 }
1459
1460 return( 0 );
1461}
1462#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001463
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001464#if defined(MBEDTLS_SSL_ALPN)
1465static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001466 const unsigned char *buf, size_t len )
1467{
1468 size_t list_len, name_len;
1469 const char **p;
1470
1471 /* If we didn't send it, the server shouldn't send it */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001472 if( ssl->conf->alpn_list == NULL )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001473 {
1474 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching ALPN extension" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001475 mbedtls_ssl_pend_fatal_alert( ssl,
1476 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001477 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001478 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001479
1480 /*
1481 * opaque ProtocolName<1..2^8-1>;
1482 *
1483 * struct {
1484 * ProtocolName protocol_name_list<2..2^16-1>
1485 * } ProtocolNameList;
1486 *
1487 * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
1488 */
1489
1490 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
1491 if( len < 4 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001492 {
Hanno Beckerde62da92019-07-24 13:23:50 +01001493 mbedtls_ssl_pend_fatal_alert( ssl,
1494 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001495 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001496 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001497
1498 list_len = ( buf[0] << 8 ) | buf[1];
1499 if( list_len != len - 2 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001500 {
Hanno Beckerde62da92019-07-24 13:23:50 +01001501 mbedtls_ssl_pend_fatal_alert( ssl,
1502 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001503 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001504 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001505
1506 name_len = buf[2];
1507 if( name_len != list_len - 1 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001508 {
Hanno Beckerde62da92019-07-24 13:23:50 +01001509 mbedtls_ssl_pend_fatal_alert( ssl,
1510 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001511 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001512 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001513
1514 /* Check that the server chosen protocol was in our list and save it */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001515 for( p = ssl->conf->alpn_list; *p != NULL; p++ )
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001516 {
1517 if( name_len == strlen( *p ) &&
1518 memcmp( buf + 3, *p, name_len ) == 0 )
1519 {
1520 ssl->alpn_chosen = *p;
1521 return( 0 );
1522 }
1523 }
1524
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001525 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ALPN extension: no matching protocol" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001526 mbedtls_ssl_pend_fatal_alert( ssl,
1527 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001528 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001529}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001530#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001531
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001532/*
1533 * Parse HelloVerifyRequest. Only called after verifying the HS type.
1534 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001535#if defined(MBEDTLS_SSL_PROTO_DTLS)
1536static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001537{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001538 const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001539 int major_ver, minor_ver;
1540 unsigned char cookie_len;
1541
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001542 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001543
1544 /*
1545 * struct {
1546 * ProtocolVersion server_version;
1547 * opaque cookie<0..2^8-1>;
1548 * } HelloVerifyRequest;
1549 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001550 MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001551 mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001552 p += 2;
1553
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02001554 /*
1555 * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1)
1556 * even is lower than our min version.
1557 */
Hanno Becker7bcf2b52019-07-26 09:02:40 +01001558 if( mbedtls_ssl_ver_lt( major_ver, MBEDTLS_SSL_MAJOR_VERSION_3 ) ||
1559 mbedtls_ssl_ver_lt( minor_ver, MBEDTLS_SSL_MINOR_VERSION_2 ) ||
1560 mbedtls_ssl_ver_gt( major_ver,
1561 mbedtls_ssl_conf_get_max_major_ver( ssl->conf ) ) ||
1562 mbedtls_ssl_ver_gt( minor_ver,
1563 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ) )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001564 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001565 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server version" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001566
Hanno Beckerde62da92019-07-24 13:23:50 +01001567 mbedtls_ssl_pend_fatal_alert( ssl,
1568 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001569
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001570 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001571 }
1572
1573 cookie_len = *p++;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001574 MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001575
Andres AG5a87c932016-09-26 14:53:05 +01001576 if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len )
1577 {
1578 MBEDTLS_SSL_DEBUG_MSG( 1,
1579 ( "cookie length does not match incoming message size" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001580 mbedtls_ssl_pend_fatal_alert( ssl,
1581 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Andres AG5a87c932016-09-26 14:53:05 +01001582 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1583 }
1584
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001585 mbedtls_free( ssl->handshake->verify_cookie );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001586
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001587 ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001588 if( ssl->handshake->verify_cookie == NULL )
1589 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02001590 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", cookie_len ) );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02001591 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001592 }
1593
1594 memcpy( ssl->handshake->verify_cookie, p, cookie_len );
1595 ssl->handshake->verify_cookie_len = cookie_len;
1596
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02001597 /* Start over at ClientHello */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001598 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
1599 mbedtls_ssl_reset_checksum( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001600
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001601 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001602
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001603 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse hello verify request" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001604
1605 return( 0 );
1606}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001607#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001608
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001609static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001610{
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001611 int ret, i;
Paul Bakker23986e52011-04-24 08:57:21 +00001612 size_t n;
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001613 size_t ext_len;
Paul Bakker48916f92012-09-16 19:57:18 +00001614 unsigned char *buf, *ext;
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001615 unsigned char comp;
1616#if defined(MBEDTLS_ZLIB_SUPPORT)
1617 int accept_comp;
1618#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001619#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001620 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001621#endif
Hanno Becker03b64fa2019-06-11 14:39:38 +01001622#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1623 int extended_ms_seen = 0;
1624#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001625 int handshake_failure = 0;
Hanno Becker14990272019-06-26 11:47:15 +01001626
1627 /* The ciphersuite chosen by the server. */
1628 mbedtls_ssl_ciphersuite_handle_t server_suite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001629
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001630 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001631
Hanno Becker327c93b2018-08-15 13:56:18 +01001632 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001633 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001634 /* No alert on a read error. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001635 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001636 return( ret );
1637 }
1638
Hanno Beckerf5970a02019-05-08 09:38:41 +01001639 buf = ssl->in_msg;
1640
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001641 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001642 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001643#if defined(MBEDTLS_SSL_RENEGOTIATION)
1644 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001645 {
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001646 ssl->renego_records_seen++;
1647
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001648 if( ssl->conf->renego_max_records >= 0 &&
1649 ssl->renego_records_seen > ssl->conf->renego_max_records )
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001650 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001651 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, "
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001652 "but not honored by server" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001653 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001654 }
1655
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001656 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-handshake message during renego" ) );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01001657
1658 ssl->keep_current_message = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001659 return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO );
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001660 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001661#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001662
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001663 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001664 mbedtls_ssl_pend_fatal_alert( ssl,
1665 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001666 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001667 }
1668
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001669#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02001670 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001671 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001672 if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001673 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001674 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received hello verify request" ) );
1675 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001676 return( ssl_parse_hello_verify_request( ssl ) );
1677 }
1678 else
1679 {
1680 /* We made it through the verification process */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001681 mbedtls_free( ssl->handshake->verify_cookie );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001682 ssl->handshake->verify_cookie = NULL;
1683 ssl->handshake->verify_cookie_len = 0;
1684 }
1685 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001686#endif /* MBEDTLS_SSL_PROTO_DTLS */
Paul Bakker5121ce52009-01-03 21:22:43 +00001687
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001688 if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) ||
1689 buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO )
Paul Bakker5121ce52009-01-03 21:22:43 +00001690 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001691 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001692 mbedtls_ssl_pend_fatal_alert( ssl,
1693 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001694 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001695 }
1696
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001697 /*
1698 * 0 . 1 server_version
1699 * 2 . 33 random (maybe including 4 bytes of Unix time)
1700 * 34 . 34 session_id length = n
1701 * 35 . 34+n session_id
1702 * 35+n . 36+n cipher_suite
1703 * 37+n . 37+n compression_method
1704 *
1705 * 38+n . 39+n extensions length (optional)
1706 * 40+n . .. extensions
1707 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001708 buf += mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001709
Paul Bakker1d29fb52012-09-28 13:28:45 +00001710 {
Hanno Becker3fa1ee52019-05-22 14:44:37 +01001711 int major_ver, minor_ver;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001712
Hanno Becker3fa1ee52019-05-22 14:44:37 +01001713 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", buf + 0, 2 );
1714 mbedtls_ssl_read_version( &major_ver, &minor_ver,
1715 ssl->conf->transport,
1716 buf + 0 );
Paul Bakker1d29fb52012-09-28 13:28:45 +00001717
Hanno Becker7bcf2b52019-07-26 09:02:40 +01001718 if( mbedtls_ssl_ver_lt( major_ver,
1719 mbedtls_ssl_conf_get_min_major_ver( ssl->conf ) ) ||
1720 mbedtls_ssl_ver_lt( minor_ver,
1721 mbedtls_ssl_conf_get_min_minor_ver( ssl->conf ) ) ||
1722 mbedtls_ssl_ver_gt( major_ver,
1723 mbedtls_ssl_conf_get_max_major_ver( ssl->conf ) ) ||
1724 mbedtls_ssl_ver_gt( minor_ver,
1725 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ) )
Hanno Becker3fa1ee52019-05-22 14:44:37 +01001726 {
1727 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server version out of bounds - "
1728 " min: [%d:%d], server: [%d:%d], max: [%d:%d]",
1729 mbedtls_ssl_conf_get_min_major_ver( ssl->conf ),
1730 mbedtls_ssl_conf_get_min_minor_ver( ssl->conf ),
1731 major_ver, minor_ver,
1732 mbedtls_ssl_conf_get_max_major_ver( ssl->conf ),
1733 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ) );
1734
Hanno Beckerde62da92019-07-24 13:23:50 +01001735 mbedtls_ssl_pend_fatal_alert( ssl,
1736 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Hanno Becker3fa1ee52019-05-22 14:44:37 +01001737
1738 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
1739 }
1740
Hanno Becker381eaa52019-06-12 14:43:01 +01001741#if !defined(MBEDTLS_SSL_CONF_FIXED_MINOR_VER)
Hanno Becker3fa1ee52019-05-22 14:44:37 +01001742 ssl->minor_ver = minor_ver;
Hanno Becker381eaa52019-06-12 14:43:01 +01001743#endif /* !MBEDTLS_SSL_CONF_FIXED_MINOR_VER */
1744
1745#if !defined(MBEDTLS_SSL_CONF_FIXED_MAJOR_VER)
Hanno Becker3fa1ee52019-05-22 14:44:37 +01001746 ssl->major_ver = major_ver;
Hanno Becker381eaa52019-06-12 14:43:01 +01001747#endif /* !MBEDTLS_SSL_CONF_FIXED_MAJOR_VER */
Paul Bakker1d29fb52012-09-28 13:28:45 +00001748 }
1749
Andres Amaya Garcia6bce9cb2017-09-06 15:33:34 +01001750 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu",
1751 ( (uint32_t) buf[2] << 24 ) |
1752 ( (uint32_t) buf[3] << 16 ) |
1753 ( (uint32_t) buf[4] << 8 ) |
1754 ( (uint32_t) buf[5] ) ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001755
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001756 memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001757
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001758 n = buf[34];
Paul Bakker5121ce52009-01-03 21:22:43 +00001759
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001760 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 2, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001761
Paul Bakker48916f92012-09-16 19:57:18 +00001762 if( n > 32 )
1763 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001764 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001765 mbedtls_ssl_pend_fatal_alert( ssl,
1766 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001767 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001768 }
1769
Manuel Pégourié-Gonnarda6e5bd52015-07-23 12:14:13 +02001770 if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +00001771 {
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001772 ext_len = ( ( buf[38 + n] << 8 )
1773 | ( buf[39 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001774
Paul Bakker48916f92012-09-16 19:57:18 +00001775 if( ( ext_len > 0 && ext_len < 4 ) ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001776 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len )
Paul Bakker48916f92012-09-16 19:57:18 +00001777 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001778 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001779 mbedtls_ssl_pend_fatal_alert( ssl,
1780 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001781 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001782 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001783 }
Manuel Pégourié-Gonnarda6e5bd52015-07-23 12:14:13 +02001784 else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n )
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001785 {
1786 ext_len = 0;
1787 }
1788 else
1789 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001790 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001791 mbedtls_ssl_pend_fatal_alert( ssl,
1792 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001793 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001794 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001795
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001796 /* ciphersuite (used later) */
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001797 i = ( buf[35 + n] << 8 ) | buf[36 + n];
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001798
1799 /*
1800 * Read and check compression
1801 */
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001802 comp = buf[37 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +00001803
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001804#if defined(MBEDTLS_ZLIB_SUPPORT)
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001805 /* See comments in ssl_write_client_hello() */
Manuel Pégourié-Gonnardff4bd9f2019-06-06 10:34:48 +02001806 accept_comp = MBEDTLS_SSL_TRANSPORT_IS_TLS( ssl->conf->transport );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001807
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001808 if( comp != MBEDTLS_SSL_COMPRESS_NULL &&
1809 ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) )
1810#else /* MBEDTLS_ZLIB_SUPPORT */
1811 if( comp != MBEDTLS_SSL_COMPRESS_NULL )
1812#endif/* MBEDTLS_ZLIB_SUPPORT */
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001813 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001814 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server hello, bad compression: %d", comp ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001815 mbedtls_ssl_pend_fatal_alert( ssl,
1816 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001817 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001818 }
1819
Paul Bakker380da532012-04-18 16:10:25 +00001820 /*
1821 * Initialize update checksum functions
1822 */
Hanno Becker14990272019-06-26 11:47:15 +01001823 server_suite_info = mbedtls_ssl_ciphersuite_from_id( i );
Hanno Becker73f4cb12019-06-27 13:51:07 +01001824#if !defined(MBEDTLS_SSL_CONF_SINGLE_CIPHERSUITE)
Hanno Becker14990272019-06-26 11:47:15 +01001825 ssl->handshake->ciphersuite_info = server_suite_info;
1826#endif
1827 if( server_suite_info == MBEDTLS_SSL_CIPHERSUITE_INVALID_HANDLE )
Paul Bakker68884e32013-01-07 18:20:04 +01001828 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001829 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %04x not found", i ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001830 mbedtls_ssl_pend_fatal_alert( ssl,
1831 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001832 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +01001833 }
Manuel Pégourié-Gonnard3c599f12014-03-10 13:25:07 +01001834
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001835 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
1836 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 35, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001837
1838 /*
1839 * Check if the session can be resumed
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +02001840 *
1841 * We're only resuming a session if it was requested (handshake->resume
1842 * already set to 1 by mbedtls_ssl_set_session()), and further conditions
1843 * are satisfied (not renegotiating, ID and ciphersuite match, etc).
1844 *
1845 * Update handshake->resume to the value it will keep for the rest of the
1846 * handshake, and that will be used to determine the relative order
1847 * client/server last flights, as well as in handshake_wrapup().
Paul Bakker5121ce52009-01-03 21:22:43 +00001848 */
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001849#if !defined(MBEDTLS_SSL_NO_SESSION_RESUMPTION)
1850 if( n == 0 ||
Manuel Pégourié-Gonnard754b9f32019-07-01 12:20:54 +02001851 mbedtls_ssl_get_renego_status( ssl ) != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
Hanno Beckere02758c2019-06-26 15:31:31 +01001852 mbedtls_ssl_session_get_ciphersuite( ssl->session_negotiate ) != i ||
Hanno Becker88440552019-07-03 14:16:13 +01001853 mbedtls_ssl_session_get_compression( ssl->session_negotiate ) != comp ||
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001854 ssl->session_negotiate->id_len != n ||
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001855 memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001856 {
Paul Bakker0a597072012-09-25 21:55:46 +00001857 ssl->handshake->resume = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001858 }
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +02001859#endif /* !MBEDTLS_SSL_NO_SESSION_RESUMPTION */
1860
1861 if( mbedtls_ssl_handshake_get_resume( ssl->handshake ) == 1 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001862 {
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +02001863 /* Resume a session */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001864 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00001865
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001866 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Paul Bakkerff60ee62010-03-16 21:09:09 +00001867 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001868 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Hanno Beckerde62da92019-07-24 13:23:50 +01001869 mbedtls_ssl_pend_fatal_alert( ssl,
1870 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Paul Bakkerff60ee62010-03-16 21:09:09 +00001871 return( ret );
1872 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001873 }
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001874 else
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001875 {
Manuel Pégourié-Gonnard93c82622019-07-01 12:47:27 +02001876 /* Start a new session */
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001877 ssl->state++;
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001878#if defined(MBEDTLS_HAVE_TIME)
1879 ssl->session_negotiate->start = mbedtls_time( NULL );
1880#endif
Hanno Becker73f4cb12019-06-27 13:51:07 +01001881#if !defined(MBEDTLS_SSL_CONF_SINGLE_CIPHERSUITE)
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001882 ssl->session_negotiate->ciphersuite = i;
Hanno Becker73f4cb12019-06-27 13:51:07 +01001883#endif /* MBEDTLS_SSL_CONF_SINGLE_CIPHERSUITE */
Hanno Becker88440552019-07-03 14:16:13 +01001884#if defined(MBEDTLS_ZLIB_SUPPORT)
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001885 ssl->session_negotiate->compression = comp;
Hanno Becker88440552019-07-03 14:16:13 +01001886#endif
Jarno Lamsa29f2dd02019-06-20 15:31:52 +03001887 ssl->session_negotiate->id_len = n;
1888 memcpy( ssl->session_negotiate->id, buf + 35, n );
1889 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001890
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001891 MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Manuel Pégourié-Gonnard3652e992019-07-01 12:09:22 +02001892 mbedtls_ssl_handshake_get_resume( ssl->handshake ) ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001893
Manuel Pégourié-Gonnard60884a12015-09-16 11:13:41 +02001894 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", i ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001895 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[37 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001896
Andrzej Kurek03bac442018-04-25 05:06:07 -04001897 /*
1898 * Perform cipher suite validation in same way as in ssl_write_client_hello.
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01001899 */
Hanno Becker14990272019-06-26 11:47:15 +01001900 MBEDTLS_SSL_BEGIN_FOR_EACH_CIPHERSUITE( ssl,
Hanno Becker981f81d2019-07-19 16:10:49 +01001901 mbedtls_ssl_get_minor_ver( ssl ),
Hanno Becker14990272019-06-26 11:47:15 +01001902 ciphersuite_info )
Paul Bakker5121ce52009-01-03 21:22:43 +00001903 {
Hanno Becker14990272019-06-26 11:47:15 +01001904 if( ssl_validate_ciphersuite( ciphersuite_info, ssl,
Hanno Becker2881d802019-05-22 14:44:53 +01001905 mbedtls_ssl_conf_get_min_minor_ver( ssl->conf ),
1906 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001907 {
Hanno Beckerf4d6b492019-07-02 17:13:14 +01001908 continue;
Paul Bakker5121ce52009-01-03 21:22:43 +00001909 }
1910
Hanno Becker14990272019-06-26 11:47:15 +01001911 if( ciphersuite_info != server_suite_info )
Hanno Beckerf4d6b492019-07-02 17:13:14 +01001912 continue;
Paul Bakker5121ce52009-01-03 21:22:43 +00001913
Hanno Becker14990272019-06-26 11:47:15 +01001914 goto server_picked_valid_suite;
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01001915 }
Hanno Becker14990272019-06-26 11:47:15 +01001916 MBEDTLS_SSL_END_FOR_EACH_CIPHERSUITE
1917
1918 /* If we reach this code-path, the server's chosen ciphersuite
1919 * wasn't among those advertised by us. */
1920 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001921 mbedtls_ssl_pend_fatal_alert( ssl,
1922 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Hanno Becker14990272019-06-26 11:47:15 +01001923 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1924
1925server_picked_valid_suite:
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01001926
Hanno Becker473f98f2019-06-26 10:27:32 +01001927 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s",
Hanno Becker14990272019-06-26 11:47:15 +01001928 mbedtls_ssl_suite_get_name( server_suite_info ) ) );
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01001929
Manuel Pégourié-Gonnardda19f4c2018-06-12 12:40:54 +02001930#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Hanno Becker14990272019-06-26 11:47:15 +01001931 if( mbedtls_ssl_suite_get_key_exchange( server_suite_info ) ==
Hanno Becker473f98f2019-06-26 10:27:32 +01001932 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA &&
Hanno Becker2881d802019-05-22 14:44:53 +01001933 mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardda19f4c2018-06-12 12:40:54 +02001934 {
1935 ssl->handshake->ecrs_enabled = 1;
1936 }
1937#endif
1938
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001939 if( comp != MBEDTLS_SSL_COMPRESS_NULL
1940#if defined(MBEDTLS_ZLIB_SUPPORT)
1941 && comp != MBEDTLS_SSL_COMPRESS_DEFLATE
Paul Bakker2770fbd2012-07-03 13:30:23 +00001942#endif
1943 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001944 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001945 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001946 mbedtls_ssl_pend_fatal_alert( ssl,
1947 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001948 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001949 }
Hanno Becker88440552019-07-03 14:16:13 +01001950#if defined(MBEDTLS_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001951 ssl->session_negotiate->compression = comp;
Hanno Becker88440552019-07-03 14:16:13 +01001952#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001953
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001954 ext = buf + 40 + n;
Paul Bakker48916f92012-09-16 19:57:18 +00001955
Hanno Becker2881d802019-05-22 14:44:53 +01001956 MBEDTLS_SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d",
1957 ext_len ) );
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001958
Paul Bakker48916f92012-09-16 19:57:18 +00001959 while( ext_len )
1960 {
1961 unsigned int ext_id = ( ( ext[0] << 8 )
1962 | ( ext[1] ) );
1963 unsigned int ext_size = ( ( ext[2] << 8 )
1964 | ( ext[3] ) );
1965
1966 if( ext_size + 4 > ext_len )
1967 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001968 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01001969 mbedtls_ssl_pend_fatal_alert( ssl,
1970 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001971 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001972 }
1973
1974 switch( ext_id )
1975 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001976 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
1977 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
1978#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001979 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001980#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001981
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001982 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4,
1983 ext_size ) ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001984 return( ret );
1985
1986 break;
1987
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001988#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1989 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
1990 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001991
1992 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
1993 ext + 4, ext_size ) ) != 0 )
1994 {
1995 return( ret );
1996 }
1997
1998 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001999#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02002000
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002001#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
2002 case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
2003 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002004
2005 if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
2006 ext + 4, ext_size ) ) != 0 )
2007 {
2008 return( ret );
2009 }
2010
2011 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002012#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002013
Hanno Beckera5a2b082019-05-15 14:03:01 +01002014#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker1ba81f62019-04-26 15:37:26 +01002015 case MBEDTLS_TLS_EXT_CID:
2016 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found CID extension" ) );
2017
2018 if( ( ret = ssl_parse_cid_ext( ssl,
2019 ext + 4,
2020 ext_size ) ) != 0 )
2021 {
2022 return( ret );
2023 }
2024
2025 break;
Hanno Beckera5a2b082019-05-15 14:03:01 +01002026#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker1ba81f62019-04-26 15:37:26 +01002027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002028#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2029 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
2030 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002031
2032 if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl,
2033 ext + 4, ext_size ) ) != 0 )
2034 {
2035 return( ret );
2036 }
2037
2038 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002039#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002041#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2042 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
2043 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended_master_secret extension" ) );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002044
2045 if( ( ret = ssl_parse_extended_ms_ext( ssl,
2046 ext + 4, ext_size ) ) != 0 )
2047 {
2048 return( ret );
2049 }
Hanno Becker03b64fa2019-06-11 14:39:38 +01002050 extended_ms_seen = 1;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002051
2052 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002053#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002054
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002055#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2056 case MBEDTLS_TLS_EXT_SESSION_TICKET:
2057 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02002058
2059 if( ( ret = ssl_parse_session_ticket_ext( ssl,
2060 ext + 4, ext_size ) ) != 0 )
2061 {
2062 return( ret );
2063 }
2064
2065 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002066#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02002067
Robert Cragie136884c2015-10-02 13:34:31 +01002068#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01002069 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002070 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
2071 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002072
2073 if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
2074 ext + 4, ext_size ) ) != 0 )
2075 {
2076 return( ret );
2077 }
2078
2079 break;
Robert Cragieae8535d2015-10-06 17:11:18 +01002080#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
2081 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002082
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02002083#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2084 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
2085 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) );
2086
2087 if( ( ret = ssl_parse_ecjpake_kkpp( ssl,
2088 ext + 4, ext_size ) ) != 0 )
2089 {
2090 return( ret );
2091 }
2092
2093 break;
2094#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002095
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002096#if defined(MBEDTLS_SSL_ALPN)
2097 case MBEDTLS_TLS_EXT_ALPN:
2098 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002099
2100 if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 )
2101 return( ret );
2102
2103 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002104#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002105
Paul Bakker48916f92012-09-16 19:57:18 +00002106 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002107 MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
Paul Bakker48916f92012-09-16 19:57:18 +00002108 ext_id ) );
2109 }
2110
2111 ext_len -= 4 + ext_size;
2112 ext += 4 + ext_size;
2113
2114 if( ext_len > 0 && ext_len < 4 )
2115 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002116 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
2117 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00002118 }
2119 }
2120
2121 /*
2122 * Renegotiation security checks
2123 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002124 if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Hanno Beckerb0b2b672019-06-12 16:58:10 +01002125 mbedtls_ssl_conf_get_allow_legacy_renegotiation( ssl->conf ) ==
2126 MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00002127 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002128 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002129 handshake_failure = 1;
2130 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002131#if defined(MBEDTLS_SSL_RENEGOTIATION)
2132 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2133 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Paul Bakker48916f92012-09-16 19:57:18 +00002134 renegotiation_info_seen == 0 )
2135 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002136 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002137 handshake_failure = 1;
2138 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002139 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2140 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Hanno Beckerb0b2b672019-06-12 16:58:10 +01002141 mbedtls_ssl_conf_get_allow_legacy_renegotiation( ssl->conf ) ==
2142 MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00002143 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002144 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002145 handshake_failure = 1;
2146 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002147 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2148 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002149 renegotiation_info_seen == 1 )
2150 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002151 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002152 handshake_failure = 1;
2153 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002154#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002155
Jarno Lamsa842be162019-06-10 15:05:33 +03002156 /*
2157 * Check if extended master secret is being enforced
2158 */
2159#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Hanno Beckeraabbb582019-06-11 13:43:27 +01002160 if( mbedtls_ssl_conf_get_ems( ssl->conf ) ==
Hanno Becker03b64fa2019-06-11 14:39:38 +01002161 MBEDTLS_SSL_EXTENDED_MS_ENABLED )
Jarno Lamsa842be162019-06-10 15:05:33 +03002162 {
Hanno Becker03b64fa2019-06-11 14:39:38 +01002163 if( extended_ms_seen )
2164 {
Hanno Becker1ab322b2019-06-11 14:50:54 +01002165#if !defined(MBEDTLS_SSL_EXTENDED_MS_ENFORCED)
Hanno Becker03b64fa2019-06-11 14:39:38 +01002166 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Hanno Becker1ab322b2019-06-11 14:50:54 +01002167#endif /* !MBEDTLS_SSL_EXTENDED_MS_ENFORCED */
Hanno Becker03b64fa2019-06-11 14:39:38 +01002168 }
2169 else if( mbedtls_ssl_conf_get_ems_enforced( ssl->conf ) ==
2170 MBEDTLS_SSL_EXTENDED_MS_ENFORCE_ENABLED )
2171 {
2172 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Peer not offering extended master "
Jarno Lamsa842be162019-06-10 15:05:33 +03002173 "secret, while it is enforced") );
Hanno Becker03b64fa2019-06-11 14:39:38 +01002174 handshake_failure = 1;
2175 }
Jarno Lamsa842be162019-06-10 15:05:33 +03002176 }
2177#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
2178
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002179 if( handshake_failure == 1 )
2180 {
Hanno Beckerde62da92019-07-24 13:23:50 +01002181 mbedtls_ssl_pend_fatal_alert( ssl,
2182 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002183 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00002184 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002185
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002186 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002187
2188 return( 0 );
2189}
2190
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002191#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2192 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
2193static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl, unsigned char **p,
Paul Bakker29e1f122013-04-16 13:07:56 +02002194 unsigned char *end )
2195{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002196 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker29e1f122013-04-16 13:07:56 +02002197
Paul Bakker29e1f122013-04-16 13:07:56 +02002198 /*
2199 * Ephemeral DH parameters:
2200 *
2201 * struct {
2202 * opaque dh_p<1..2^16-1>;
2203 * opaque dh_g<1..2^16-1>;
2204 * opaque dh_Ys<1..2^16-1>;
2205 * } ServerDHParams;
2206 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002207 if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002208 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002209 MBEDTLS_SSL_DEBUG_RET( 2, ( "mbedtls_dhm_read_params" ), ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002210 return( ret );
2211 }
2212
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02002213 if( ssl->handshake->dhm_ctx.len * 8 < ssl->conf->dhm_min_bitlen )
Paul Bakker29e1f122013-04-16 13:07:56 +02002214 {
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02002215 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHM prime too short: %d < %d",
2216 ssl->handshake->dhm_ctx.len * 8,
2217 ssl->conf->dhm_min_bitlen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002218 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002219 }
2220
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002221 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
2222 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
2223 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +02002224
2225 return( ret );
2226}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002227#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2228 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002229
Hanno Becker29d16552019-07-24 11:11:45 +01002230#if defined(MBEDTLS_ECDH_C) && \
2231 ( defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2232 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2233 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
2234 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2235 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002236static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002237{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002238 const mbedtls_ecp_curve_info *curve_info;
Janos Follath3fbdada2018-08-15 10:26:53 +01002239 mbedtls_ecp_group_id grp_id;
2240#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
2241 grp_id = ssl->handshake->ecdh_ctx.grp.id;
2242#else
2243 grp_id = ssl->handshake->ecdh_ctx.grp_id;
2244#endif
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002245
Janos Follath3fbdada2018-08-15 10:26:53 +01002246 curve_info = mbedtls_ecp_curve_info_from_grp_id( grp_id );
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002247 if( curve_info == NULL )
2248 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002249 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2250 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01002251 }
2252
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002253 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002254
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02002255#if defined(MBEDTLS_ECP_C)
Janos Follath3fbdada2018-08-15 10:26:53 +01002256 if( mbedtls_ssl_check_curve( ssl, grp_id ) != 0 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002257#else
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002258 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
2259 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002260#endif
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002261 return( -1 );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002262
Janos Follath3fbdada2018-08-15 10:26:53 +01002263 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
2264 MBEDTLS_DEBUG_ECDH_QP );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002265
2266 return( 0 );
2267}
Hanno Becker29d16552019-07-24 11:11:45 +01002268#endif /* MBEDTLS_ECDH_C &&
2269 ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2270 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2271 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2272 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2273 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED ) */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002274
Hanno Becker29d16552019-07-24 11:11:45 +01002275#if defined(MBEDTLS_ECDH_C) && \
2276 ( defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2277 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2278 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED))
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002279static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
Paul Bakker29e1f122013-04-16 13:07:56 +02002280 unsigned char **p,
2281 unsigned char *end )
2282{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002283 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker29e1f122013-04-16 13:07:56 +02002284
Paul Bakker29e1f122013-04-16 13:07:56 +02002285 /*
2286 * Ephemeral ECDH parameters:
2287 *
2288 * struct {
2289 * ECParameters curve_params;
2290 * ECPoint public;
2291 * } ServerECDHParams;
2292 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002293 if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx,
Paul Bakker29e1f122013-04-16 13:07:56 +02002294 (const unsigned char **) p, end ) ) != 0 )
2295 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002296 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_read_params" ), ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002297 return( ret );
2298 }
2299
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002300 if( ssl_check_server_ecdh_params( ssl ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002301 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002302 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDHE curve)" ) );
2303 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002304 }
2305
Paul Bakker29e1f122013-04-16 13:07:56 +02002306 return( ret );
2307}
Hanno Becker29d16552019-07-24 11:11:45 +01002308#endif /* MBEDTLS_ECDH_C &&
2309 ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2310 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2311 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ) */
Paul Bakker29e1f122013-04-16 13:07:56 +02002312
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002313#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
2314static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002315 unsigned char **p,
2316 unsigned char *end )
2317{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002318 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002319 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02002320 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002321
2322 /*
2323 * PSK parameters:
2324 *
2325 * opaque psk_identity_hint<0..2^16-1>;
2326 */
Hanno Becker0c161d12018-10-08 13:40:50 +01002327 if( end - (*p) < 2 )
Krzysztof Stachowiak740b2182018-03-13 11:31:14 +01002328 {
2329 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message "
2330 "(psk_identity_hint length)" ) );
2331 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2332 }
Manuel Pégourié-Gonnard59b9fe22013-10-15 11:55:33 +02002333 len = (*p)[0] << 8 | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002334 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002335
Hanno Becker8df10232018-10-10 15:48:39 +01002336 if( end - (*p) < (int) len )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002337 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002338 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message "
2339 "(psk_identity_hint length)" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002340 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002341 }
2342
Manuel Pégourié-Gonnard9d624122016-02-22 11:10:14 +01002343 /*
2344 * Note: we currently ignore the PKS identity hint, as we only allow one
2345 * PSK to be provisionned on the client. This could be changed later if
2346 * someone needs that feature.
2347 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002348 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002349 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002350
2351 return( ret );
2352}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002353#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002354
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002355#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
2356 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Hanno Becker01290c72018-05-23 13:08:07 +01002357
Hanno Becker48e526b2019-08-12 14:59:32 +01002358/* This function assumes that `out` points to a writable buffer
2359 * of size 48 Bytes if `add_length_tag == 0` and size 50 Bytes
2360 * if `add_length_tag != 0`. */
Hanno Becker01290c72018-05-23 13:08:07 +01002361static int ssl_rsa_generate_partial_pms( mbedtls_ssl_context *ssl,
2362 unsigned char* out,
2363 unsigned add_length_tag )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002364{
2365 int ret;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02002366
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002367 /*
Hanno Becker01290c72018-05-23 13:08:07 +01002368 * Generate (part of) the pre-master secret as
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002369 * struct {
Hanno Becker01290c72018-05-23 13:08:07 +01002370 * [ uint16 length(48) ]
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002371 * ProtocolVersion client_version;
2372 * opaque random[46];
2373 * } PreMasterSecret;
2374 */
Hanno Becker01290c72018-05-23 13:08:07 +01002375
2376 if( add_length_tag )
2377 {
2378 out[0] = 0;
2379 out[1] = 48;
2380 out += 2;
2381 }
2382
Hanno Beckere965bd32019-06-12 14:04:34 +01002383 mbedtls_ssl_write_version( mbedtls_ssl_conf_get_max_major_ver( ssl->conf ),
2384 mbedtls_ssl_conf_get_max_minor_ver( ssl->conf ),
Hanno Becker01290c72018-05-23 13:08:07 +01002385 ssl->conf->transport, out );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002386
Hanno Beckerece325c2019-06-13 15:39:27 +01002387 if( ( ret = mbedtls_ssl_conf_get_frng( ssl->conf )
Hanno Becker9a122432019-07-23 13:24:02 +01002388 ( mbedtls_ssl_conf_get_prng( ssl->conf ), out + 2, 46 ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002389 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002390 MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002391 return( ret );
2392 }
2393
Hanno Becker01290c72018-05-23 13:08:07 +01002394 return( 0 );
2395}
2396
2397/*
Hanno Beckeraa496202019-08-12 14:55:33 +01002398 * Encrypt the randomly chosen part of the Premaster Secret with the
2399 * server's RSA key and write it to the provided buffer.
Hanno Becker01290c72018-05-23 13:08:07 +01002400 */
2401static int ssl_rsa_encrypt_partial_pms( mbedtls_ssl_context *ssl,
2402 unsigned char const *ppms,
2403 unsigned char *out, size_t buflen,
2404 size_t *olen )
2405{
2406 int ret;
2407 size_t len_bytes = mbedtls_ssl_get_minor_ver( ssl ) ==
2408 MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2;
2409 mbedtls_pk_context *peer_pk = NULL;
2410
2411 if( buflen < len_bytes )
2412 {
2413 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) );
2414 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2415 }
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002416
Hanno Becker374800a2019-02-06 16:49:54 +00002417#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Becker5882dd02019-06-06 16:25:57 +01002418 /* Because the peer CRT pubkey is embedded into the handshake
2419 * params currently, and there's no 'is_init' functions for PK
2420 * contexts, we need to break the abstraction and peek into
2421 * the PK context to see if it has been initialized. */
2422 if( ssl->handshake->peer_pubkey.pk_info != NULL )
2423 peer_pk = &ssl->handshake->peer_pubkey;
Hanno Becker374800a2019-02-06 16:49:54 +00002424#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker5882dd02019-06-06 16:25:57 +01002425 if( ssl->session_negotiate->peer_cert != NULL )
Hanno Becker0c168162019-02-28 14:02:30 +00002426 {
2427 ret = mbedtls_x509_crt_pk_acquire( ssl->session_negotiate->peer_cert,
2428 &peer_pk );
2429 if( ret != 0 )
2430 {
Hanno Becker2224ccf2019-06-28 10:52:45 +01002431 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_x509_crt_pk_acquire", ret );
2432 return( ret );
Hanno Becker0c168162019-02-28 14:02:30 +00002433 }
2434 }
Hanno Becker5882dd02019-06-06 16:25:57 +01002435#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2436
2437 if( peer_pk == NULL )
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002438 {
Hanno Beckerf02d5502019-02-06 17:37:32 +00002439 /* Should never happen */
Hanno Beckere9839c02019-02-26 11:51:06 +00002440 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Hanno Beckerf02d5502019-02-06 17:37:32 +00002441 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002442 }
2443
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002444 /*
Hanno Beckeraa496202019-08-12 14:55:33 +01002445 * Encrypt the partial premaster secret and write it out.
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002446 */
Hanno Becker374800a2019-02-06 16:49:54 +00002447 if( ! mbedtls_pk_can_do( peer_pk, MBEDTLS_PK_RSA ) )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002448 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002449 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
Hanno Becker0c168162019-02-28 14:02:30 +00002450 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2451 goto cleanup;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002452 }
2453
Hanno Becker374800a2019-02-06 16:49:54 +00002454 if( ( ret = mbedtls_pk_encrypt( peer_pk,
Hanno Becker01290c72018-05-23 13:08:07 +01002455 ppms, 48, out + len_bytes,
2456 olen, buflen - len_bytes,
Hanno Beckerece325c2019-06-13 15:39:27 +01002457 mbedtls_ssl_conf_get_frng( ssl->conf ),
Hanno Becker9a122432019-07-23 13:24:02 +01002458 mbedtls_ssl_conf_get_prng( ssl->conf ) ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002459 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002460 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_rsa_pkcs1_encrypt", ret );
Hanno Becker0c168162019-02-28 14:02:30 +00002461 goto cleanup;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002462 }
2463
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002464#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2465 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002466 if( len_bytes == 2 )
2467 {
Hanno Becker01290c72018-05-23 13:08:07 +01002468 out[0] = (unsigned char)( *olen >> 8 );
2469 out[1] = (unsigned char)( *olen );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002470 *olen += 2;
2471 }
2472#endif
2473
Hanno Becker0c168162019-02-28 14:02:30 +00002474cleanup:
2475
Hanno Becker6c83db72019-02-08 14:06:00 +00002476#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2477 /* We don't need the peer's public key anymore. Free it. */
2478 mbedtls_pk_free( peer_pk );
Hanno Becker0c168162019-02-28 14:02:30 +00002479#else
Hanno Beckerc6d1c3e2019-03-05 13:50:56 +00002480 mbedtls_x509_crt_pk_release( ssl->session_negotiate->peer_cert );
Hanno Becker0c168162019-02-28 14:02:30 +00002481#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2482
2483 return( ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002484}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002485#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
2486 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02002487
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002488#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard5c2a7ca2015-10-23 08:48:41 +02002489#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2490 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2491 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002492static int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl,
Paul Bakker29e1f122013-04-16 13:07:56 +02002493 unsigned char **p,
2494 unsigned char *end,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002495 mbedtls_md_type_t *md_alg,
2496 mbedtls_pk_type_t *pk_alg )
Paul Bakker29e1f122013-04-16 13:07:56 +02002497{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02002498 ((void) ssl);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002499 *md_alg = MBEDTLS_MD_NONE;
2500 *pk_alg = MBEDTLS_PK_NONE;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002501
2502 /* Only in TLS 1.2 */
Hanno Becker2881d802019-05-22 14:44:53 +01002503 if( mbedtls_ssl_get_minor_ver( ssl ) != MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002504 {
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002505 return( 0 );
2506 }
Paul Bakker29e1f122013-04-16 13:07:56 +02002507
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002508 if( (*p) + 2 > end )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002509 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002510
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002511 /*
2512 * Get hash algorithm
2513 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002514 if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) ) == MBEDTLS_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002515 {
Manuel Pégourié-Gonnardd8053242015-12-08 09:53:51 +01002516 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Server used unsupported "
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02002517 "HashAlgorithm %d", *(p)[0] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002518 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002519 }
2520
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002521 /*
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002522 * Get signature algorithm
2523 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002524 if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) ) == MBEDTLS_PK_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002525 {
Manuel Pégourié-Gonnardd8053242015-12-08 09:53:51 +01002526 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used unsupported "
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02002527 "SignatureAlgorithm %d", (*p)[1] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002528 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02002529 }
2530
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02002531 /*
2532 * Check if the hash is acceptable
2533 */
2534 if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 )
2535 {
Gilles Peskinecd3c8452017-05-09 14:57:45 +02002536 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used HashAlgorithm %d that was not offered",
2537 *(p)[0] ) );
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02002538 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2539 }
2540
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002541 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
2542 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02002543 *p += 2;
2544
2545 return( 0 );
2546}
Manuel Pégourié-Gonnard5c2a7ca2015-10-23 08:48:41 +02002547#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2548 MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2549 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002550#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02002551
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002552#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2553 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2554static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002555{
2556 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002557 const mbedtls_ecp_keypair *peer_key;
Hanno Becker53b6b7e2019-02-06 17:44:07 +00002558 mbedtls_pk_context * peer_pk;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002559
Hanno Becker53b6b7e2019-02-06 17:44:07 +00002560#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2561 peer_pk = &ssl->handshake->peer_pubkey;
2562#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002563 if( ssl->session_negotiate->peer_cert == NULL )
2564 {
Hanno Beckerf02d5502019-02-06 17:37:32 +00002565 /* Should never happen */
Hanno Beckerc39e23e2019-02-26 12:36:01 +00002566 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Hanno Beckerf02d5502019-02-06 17:37:32 +00002567 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002568 }
Hanno Becker39ae65c2019-02-28 14:03:20 +00002569
2570 ret = mbedtls_x509_crt_pk_acquire( ssl->session_negotiate->peer_cert,
2571 &peer_pk );
2572 if( ret != 0 )
2573 {
Hanno Becker2224ccf2019-06-28 10:52:45 +01002574 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_x509_crt_pk_acquire", ret );
2575 return( ret );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002576 }
Hanno Becker53b6b7e2019-02-06 17:44:07 +00002577#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002578
Hanno Becker53b6b7e2019-02-06 17:44:07 +00002579 if( ! mbedtls_pk_can_do( peer_pk, MBEDTLS_PK_ECKEY ) )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002580 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002581 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002582 ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2583 goto cleanup;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002584 }
2585
Hanno Becker53b6b7e2019-02-06 17:44:07 +00002586 peer_key = mbedtls_pk_ec( *peer_pk );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002587
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002588 if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,
2589 MBEDTLS_ECDH_THEIRS ) ) != 0 )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002590 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002591 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002592 goto cleanup;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002593 }
2594
2595 if( ssl_check_server_ecdh_params( ssl ) != 0 )
2596 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002597 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002598 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
2599 goto cleanup;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002600 }
2601
Hanno Becker39ae65c2019-02-28 14:03:20 +00002602cleanup:
2603
Hanno Becker6c83db72019-02-08 14:06:00 +00002604#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2605 /* We don't need the peer's public key anymore. Free it,
2606 * so that more RAM is available for upcoming expensive
2607 * operations like ECDHE. */
2608 mbedtls_pk_free( peer_pk );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002609#else
Hanno Beckerc6d1c3e2019-03-05 13:50:56 +00002610 mbedtls_x509_crt_pk_release( ssl->session_negotiate->peer_cert );
Hanno Becker39ae65c2019-02-28 14:03:20 +00002611#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker6c83db72019-02-08 14:06:00 +00002612
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002613 return( ret );
2614}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002615#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2616 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002617
Hanno Becker04769dd2018-05-21 09:03:36 +01002618/*
2619 *
2620 * STATE HANDLING: ServerKeyExchange
2621 *
2622 */
2623
2624/*
2625 * Overview
2626 */
2627
2628/* Main entry point; orchestrates the other functions. */
Hanno Becker7d552fa2019-08-12 15:04:59 +01002629static int ssl_process_in_server_key_exchange( mbedtls_ssl_context *ssl );
Hanno Becker04769dd2018-05-21 09:03:36 +01002630
2631/* Coordination:
2632 * Check if a ServerKeyExchange message is expected, and skip if not.
2633 * Returns a negative code on failure, or
2634 * - SSL_SRV_KEY_EXCHANGE_SKIP
2635 * - SSL_SRV_KEY_EXCHANGE_EXPECTED
2636 * indicating if a ServerKeyExchange message is expected or not.
2637 */
2638#define SSL_SRV_KEY_EXCHANGE_SKIP 0
2639#define SSL_SRV_KEY_EXCHANGE_EXPECTED 1
Hanno Becker7d552fa2019-08-12 15:04:59 +01002640static int ssl_in_server_key_exchange_coordinate( mbedtls_ssl_context *ssl );
Hanno Becker04769dd2018-05-21 09:03:36 +01002641/* Preparation
2642 * If applicable, prepare DH parameters from Server certificate. */
Hanno Becker7d552fa2019-08-12 15:04:59 +01002643static int ssl_in_server_key_exchange_prepare( mbedtls_ssl_context *ssl );
Hanno Becker04769dd2018-05-21 09:03:36 +01002644/* Parse SrvKeyExchange message and store contents
2645 * (PSK or DH parameters) in handshake structure. */
Hanno Becker7d552fa2019-08-12 15:04:59 +01002646static int ssl_in_server_key_exchange_parse( mbedtls_ssl_context *ssl,
Hanno Becker04769dd2018-05-21 09:03:36 +01002647 unsigned char *buf,
2648 size_t buflen );
2649/* Update the handshake state */
Hanno Becker7d552fa2019-08-12 15:04:59 +01002650static int ssl_in_server_key_exchange_postprocess( mbedtls_ssl_context *ssl );
Hanno Becker04769dd2018-05-21 09:03:36 +01002651
2652/*
2653 * Implementation
2654 */
2655
Hanno Becker7d552fa2019-08-12 15:04:59 +01002656static int ssl_in_server_key_exchange_prepare( mbedtls_ssl_context *ssl )
Hanno Becker04769dd2018-05-21 09:03:36 +01002657{
Hanno Beckereb76c202018-05-21 09:14:46 +01002658 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
2659 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Hanno Beckerfca604d2018-05-21 09:12:05 +01002660 ((void) ciphersuite_info);
2661
2662 /* If applicable, extract static DH parameters from Server CRT. */
2663
2664#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2665 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2666 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) ==
2667 MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
2668 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) ==
2669 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
2670 {
2671 int ret;
2672
2673 if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 )
2674 {
2675 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret );
2676 mbedtls_ssl_pend_fatal_alert( ssl,
2677 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
2678 return( ret );
2679 }
2680 }
2681#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2682 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
2683
2684 return( 0 );
Hanno Becker04769dd2018-05-21 09:03:36 +01002685}
2686
Hanno Becker7d552fa2019-08-12 15:04:59 +01002687static int ssl_in_server_key_exchange_coordinate( mbedtls_ssl_context *ssl )
Paul Bakker41c83d32013-03-20 14:39:14 +01002688{
Paul Bakker23986e52011-04-24 08:57:21 +00002689 int ret;
Hanno Becker473f98f2019-06-26 10:27:32 +01002690 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01002691 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Paul Bakker5121ce52009-01-03 21:22:43 +00002692
Hanno Becker8b7b8792018-05-21 09:30:17 +01002693 /* The ServerKeyExchange message is not used for
2694 * - RSA or
2695 * - static ECDH
2696 * ciphersuites.
2697 * It MAY be used in PSK or RSA-PSK.
2698 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002699
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002700#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002701 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) ==
2702 MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00002703 {
Hanno Beckereb76c202018-05-21 09:14:46 +01002704 return( SSL_SRV_KEY_EXCHANGE_SKIP );
Paul Bakker5121ce52009-01-03 21:22:43 +00002705 }
Manuel Pégourié-Gonnardbac0e3b2013-10-15 11:54:47 +02002706#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002707
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002708#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2709 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002710 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) ==
2711 MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
2712 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info ) ==
2713 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002714 {
Hanno Beckereb76c202018-05-21 09:14:46 +01002715 return( SSL_SRV_KEY_EXCHANGE_SKIP );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002716 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002717#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2718 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002719
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002720 /*
2721 * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
Hanno Becker8b7b8792018-05-21 09:30:17 +01002722 * doesn't use a psk_identity_hint. Peek at next message to decide whether
2723 * the ServerKeyExchange is being skipped or not.
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002724 */
Hanno Becker8b7b8792018-05-21 09:30:17 +01002725
2726 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2727 == MBEDTLS_KEY_EXCHANGE_PSK ||
2728 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2729 == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00002730 {
Hanno Becker8b7b8792018-05-21 09:30:17 +01002731 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
2732 {
2733 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
2734 return( ret );
2735 }
2736 ssl->keep_current_message = 1;
2737
2738 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
2739 ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )
Paul Bakker188c8de2013-04-19 09:13:37 +02002740 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002741 /* Current message is probably either
2742 * CertificateRequest or ServerHelloDone */
Hanno Becker8b7b8792018-05-21 09:30:17 +01002743 return( SSL_SRV_KEY_EXCHANGE_SKIP );
Paul Bakker188c8de2013-04-19 09:13:37 +02002744 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002745 }
2746
Hanno Beckereb76c202018-05-21 09:14:46 +01002747 return( SSL_SRV_KEY_EXCHANGE_EXPECTED );
Hanno Becker04769dd2018-05-21 09:03:36 +01002748}
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002749
Hanno Becker7d552fa2019-08-12 15:04:59 +01002750static int ssl_in_server_key_exchange_parse( mbedtls_ssl_context *ssl,
Hanno Becker04769dd2018-05-21 09:03:36 +01002751 unsigned char *buf,
2752 size_t buflen )
2753{
Paul Bakker5121ce52009-01-03 21:22:43 +00002754 int ret;
Hanno Becker4ec73cb2019-07-23 09:28:03 +01002755 unsigned char *p;
2756 unsigned char *end;
2757
Paul Bakker5121ce52009-01-03 21:22:43 +00002758 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
2759 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Paul Bakker5121ce52009-01-03 21:22:43 +00002760
Hanno Becker4ec73cb2019-07-23 09:28:03 +01002761 p = buf + mbedtls_ssl_hs_hdr_len( ssl );
2762 end = buf + buflen;
Paul Bakker5121ce52009-01-03 21:22:43 +00002763
Hanno Becker4ec73cb2019-07-23 09:28:03 +01002764 MBEDTLS_SSL_DEBUG_BUF( 3, "server key exchange", p, end - p );
Paul Bakker3b6a07b2013-03-21 11:56:50 +01002765
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002766#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002767 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2768 == MBEDTLS_KEY_EXCHANGE_PSK ||
2769 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2770 == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
2771 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2772 == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2773 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2774 == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002775 {
2776 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
2777 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002778 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01002779 mbedtls_ssl_pend_fatal_alert( ssl,
2780 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002781 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002782 }
2783 } /* FALLTROUGH */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002784#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002785
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002786#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \
2787 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002788 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2789 == MBEDTLS_KEY_EXCHANGE_PSK ||
2790 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2791 == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
2792 {
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002793 ; /* nothing more to do */
Hanno Becker473f98f2019-06-26 10:27:32 +01002794 }
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002795 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002796#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||
2797 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
2798#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2799 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002800 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2801 == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
2802 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2803 == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00002804 {
Paul Bakker29e1f122013-04-16 13:07:56 +02002805 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01002806 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002807 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01002808 mbedtls_ssl_pend_fatal_alert( ssl,
2809 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002810 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002811 }
2812 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002813 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002814#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2815 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Hanno Becker75f12d12019-07-23 16:16:15 +01002816#if defined(MBEDTLS_USE_TINYCRYPT)
2817 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2818 == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
2819 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2820 == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA )
2821 {
Hanno Becker75f12d12019-07-23 16:16:15 +01002822 static const unsigned char ecdh_group[] = {
2823 MBEDTLS_ECP_TLS_NAMED_CURVE,
Hanno Beckerb72fc6a2019-07-24 15:23:37 +01002824 0 /* high bits of secp256r1 TLS ID */,
2825 23 /* low bits of secp256r1 TLS ID */,
Hanno Becker75f12d12019-07-23 16:16:15 +01002826 };
2827
2828 /* Check for fixed ECDH parameter preamble. */
2829 if( (size_t)( end - p ) < sizeof( ecdh_group ) )
2830 {
2831 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad server key exchange (too short)" ) );
2832 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
2833 }
2834
2835 if( memcmp( p, ecdh_group, sizeof( ecdh_group ) ) != 0 )
2836 {
2837 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad server key exchange (unexpected header)" ) );
2838 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
2839 }
2840 p += sizeof( ecdh_group );
2841
2842 /* Read server's key share. */
2843 if( mbedtls_ssl_ecdh_read_peerkey( ssl, &p, end ) != 0 )
2844 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
2845 }
2846 else
2847#endif /* MBEDTLS_USE_TINYCRYPT */
Hanno Becker29d16552019-07-24 11:11:45 +01002848#if defined(MBEDTLS_ECDH_C) && \
2849 ( defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2850 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
2851 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) )
Hanno Becker473f98f2019-06-26 10:27:32 +01002852 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2853 == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
2854 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2855 == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
2856 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2857 == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002858 {
2859 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
2860 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002861 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01002862 mbedtls_ssl_pend_fatal_alert( ssl,
2863 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002864 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker41c83d32013-03-20 14:39:14 +01002865 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002866 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002867 else
Hanno Becker29d16552019-07-24 11:11:45 +01002868#endif /* MBEDTLS_ECDH_C &&
2869 ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2870 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2871 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002872#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01002873 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
2874 == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002875 {
2876 ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
2877 p, end - p );
2878 if( ret != 0 )
2879 {
2880 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
Hanno Beckerde62da92019-07-24 13:23:50 +01002881 mbedtls_ssl_pend_fatal_alert( ssl,
2882 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002883 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2884 }
2885 }
2886 else
2887#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002888 {
Hanno Beckera855cb62019-07-24 14:57:54 +01002889 ((void) ret);
2890 ((void) p);
2891 ((void) end);
2892 ((void) ciphersuite_info);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002893 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2894 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002895 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002896
Hanno Becker1aa267c2017-04-28 17:08:27 +01002897#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)
2898 if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002899 {
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00002900 size_t sig_len, hashlen;
2901 unsigned char hash[64];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002902 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
2903 mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
2904 unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00002905 size_t params_len = p - params;
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002906 void *rs_ctx = NULL;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002907
Hanno Becker69fad132019-02-06 18:26:03 +00002908 mbedtls_pk_context * peer_pk;
2909
Paul Bakker29e1f122013-04-16 13:07:56 +02002910 /*
2911 * Handle the digitally-signed structure
2912 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002913#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker2881d802019-05-22 14:44:53 +01002914 if( mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002915 {
Paul Bakker9659dae2013-08-28 16:21:34 +02002916 if( ssl_parse_signature_algorithm( ssl, &p, end,
2917 &md_alg, &pk_alg ) != 0 )
2918 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002919 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01002920 mbedtls_ssl_pend_fatal_alert( ssl,
2921 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002922 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker9659dae2013-08-28 16:21:34 +02002923 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002924
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002925 if( pk_alg != mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002926 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002927 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01002928 mbedtls_ssl_pend_fatal_alert( ssl,
2929 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002930 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002931 }
2932 }
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02002933 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002934#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2935#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2936 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Hanno Becker7bcf2b52019-07-26 09:02:40 +01002937 if( mbedtls_ssl_ver_lt( mbedtls_ssl_get_minor_ver( ssl ),
2938 MBEDTLS_SSL_MINOR_VERSION_3 ) )
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02002939 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002940 pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002941
Paul Bakker9659dae2013-08-28 16:21:34 +02002942 /* Default hash for ECDSA is SHA-1 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002943 if( pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE )
2944 md_alg = MBEDTLS_MD_SHA1;
Paul Bakker9659dae2013-08-28 16:21:34 +02002945 }
2946 else
2947#endif
2948 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002949 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2950 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker9659dae2013-08-28 16:21:34 +02002951 }
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002952
2953 /*
2954 * Read signature
2955 */
Krzysztof Stachowiaka1098f82018-03-13 11:28:49 +01002956
2957 if( p > end - 2 )
2958 {
2959 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01002960 mbedtls_ssl_pend_fatal_alert( ssl,
2961 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Krzysztof Stachowiaka1098f82018-03-13 11:28:49 +01002962 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2963 }
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002964 sig_len = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00002965 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002966
Krzysztof Stachowiak027f84c2018-03-13 11:29:24 +01002967 if( p != end - sig_len )
Paul Bakker41c83d32013-03-20 14:39:14 +01002968 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002969 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01002970 mbedtls_ssl_pend_fatal_alert( ssl,
2971 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002972 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker41c83d32013-03-20 14:39:14 +01002973 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002974
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002975 MBEDTLS_SSL_DEBUG_BUF( 3, "signature", p, sig_len );
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02002976
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002977 /*
2978 * Compute the hash that has been signed
2979 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002980#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2981 defined(MBEDTLS_SSL_PROTO_TLS1_1)
2982 if( md_alg == MBEDTLS_MD_NONE )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00002983 {
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002984 hashlen = 36;
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01002985 ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash, params,
2986 params_len );
2987 if( ret != 0 )
Andres Amaya Garciaf0e521e2017-06-28 12:11:42 +01002988 return( ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02002989 }
2990 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002991#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
2992 MBEDTLS_SSL_PROTO_TLS1_1 */
2993#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2994 defined(MBEDTLS_SSL_PROTO_TLS1_2)
2995 if( md_alg != MBEDTLS_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02002996 {
Gilles Peskineca1d7422018-04-24 11:53:22 +02002997 ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, &hashlen,
2998 params, params_len,
2999 md_alg );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01003000 if( ret != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02003001 return( ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02003002 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003003 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003004#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
3005 MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02003006 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003007 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3008 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02003009 }
Paul Bakker29e1f122013-04-16 13:07:56 +02003010
Gilles Peskineca1d7422018-04-24 11:53:22 +02003011 MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
Paul Bakker29e1f122013-04-16 13:07:56 +02003012
Hanno Becker69fad132019-02-06 18:26:03 +00003013#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3014 peer_pk = &ssl->handshake->peer_pubkey;
3015#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02003016 if( ssl->session_negotiate->peer_cert == NULL )
3017 {
Hanno Beckerf02d5502019-02-06 17:37:32 +00003018 /* Should never happen */
Hanno Beckerc39e23e2019-02-26 12:36:01 +00003019 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Hanno Beckerf02d5502019-02-06 17:37:32 +00003020 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02003021 }
Hanno Becker2fefa482019-02-28 14:03:46 +00003022
3023 ret = mbedtls_x509_crt_pk_acquire( ssl->session_negotiate->peer_cert,
3024 &peer_pk );
3025 if( ret != 0 )
3026 {
Hanno Becker2224ccf2019-06-28 10:52:45 +01003027 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_x509_crt_pk_acquire", ret );
3028 return( ret );
Hanno Becker2fefa482019-02-28 14:03:46 +00003029 }
Hanno Becker69fad132019-02-06 18:26:03 +00003030#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02003031
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02003032 /*
3033 * Verify signature
3034 */
Hanno Becker69fad132019-02-06 18:26:03 +00003035 if( !mbedtls_pk_can_do( peer_pk, pk_alg ) )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02003036 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003037 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01003038 mbedtls_ssl_pend_fatal_alert( ssl,
3039 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Hanno Becker2fefa482019-02-28 14:03:46 +00003040#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Beckerc6d1c3e2019-03-05 13:50:56 +00003041 mbedtls_x509_crt_pk_release( ssl->session_negotiate->peer_cert );
Hanno Becker2fefa482019-02-28 14:03:46 +00003042#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003043 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02003044 }
3045
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02003046#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003047 if( ssl->handshake->ecrs_enabled )
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +02003048 rs_ctx = &ssl->handshake->ecrs_ctx.pk;
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02003049#endif
3050
Hanno Becker69fad132019-02-06 18:26:03 +00003051 if( ( ret = mbedtls_pk_verify_restartable( peer_pk,
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02003052 md_alg, hash, hashlen, p, sig_len, rs_ctx ) ) != 0 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02003053 {
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02003054#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3055 if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS )
3056#endif
Hanno Beckerde62da92019-07-24 13:23:50 +01003057 {
3058 mbedtls_ssl_pend_fatal_alert( ssl,
3059 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR );
3060 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003061 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02003062#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3063 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3064 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3065#endif
Hanno Becker2fefa482019-02-28 14:03:46 +00003066#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Beckerc6d1c3e2019-03-05 13:50:56 +00003067 mbedtls_x509_crt_pk_release( ssl->session_negotiate->peer_cert );
Hanno Becker2fefa482019-02-28 14:03:46 +00003068#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Paul Bakkerc70b9822013-04-07 22:00:46 +02003069 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00003070 }
Hanno Becker6c83db72019-02-08 14:06:00 +00003071
3072#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3073 /* We don't need the peer's public key anymore. Free it,
3074 * so that more RAM is available for upcoming expensive
3075 * operations like ECDHE. */
3076 mbedtls_pk_free( peer_pk );
Hanno Becker2fefa482019-02-28 14:03:46 +00003077#else
Hanno Beckerc6d1c3e2019-03-05 13:50:56 +00003078 mbedtls_x509_crt_pk_release( ssl->session_negotiate->peer_cert );
Hanno Becker2fefa482019-02-28 14:03:46 +00003079#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Paul Bakker5121ce52009-01-03 21:22:43 +00003080 }
Hanno Becker1aa267c2017-04-28 17:08:27 +01003081#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003082
Hanno Becker4ec73cb2019-07-23 09:28:03 +01003083 return( 0 );
3084}
Paul Bakker5121ce52009-01-03 21:22:43 +00003085
Hanno Becker7d552fa2019-08-12 15:04:59 +01003086static int ssl_in_server_key_exchange_postprocess( mbedtls_ssl_context *ssl )
Hanno Becker4ec73cb2019-07-23 09:28:03 +01003087{
3088 ssl->state = MBEDTLS_SSL_CERTIFICATE_REQUEST;
Paul Bakker5121ce52009-01-03 21:22:43 +00003089 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003090}
3091
Hanno Becker3328b182019-08-12 15:18:29 +01003092static int ssl_process_in_server_key_exchange( mbedtls_ssl_context *ssl )
3093{
3094 int ret;
3095 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
3096
3097 /* Preparation:
3098 * Potentially extract DH parameters from Server's certificate.
3099 *
3100 * Consider: Why don't we do this as post-processing after
3101 * the server certificate has been read?
3102 */
3103 MBEDTLS_SSL_CHK( ssl_in_server_key_exchange_prepare( ssl ) );
3104
3105 /* Coordination:
3106 * Check if we expect a ServerKeyExchange */
3107 MBEDTLS_SSL_CHK( ssl_in_server_key_exchange_coordinate( ssl ) );
3108
3109 if( ret == SSL_SRV_KEY_EXCHANGE_EXPECTED )
3110 {
3111 /* Reading step */
3112 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
3113 {
3114 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3115 return( ret );
3116 }
3117
3118 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
3119 ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )
3120 {
3121 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
3122 mbedtls_ssl_pend_fatal_alert( ssl,
3123 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
3124 ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
3125 goto cleanup;
3126 }
3127 else
3128 {
3129 MBEDTLS_SSL_CHK( ssl_in_server_key_exchange_parse( ssl, ssl->in_msg,
3130 ssl->in_hslen ) );
3131 }
3132 }
3133 else if( ret == SSL_SRV_KEY_EXCHANGE_SKIP )
3134 {
3135 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
3136 }
3137
3138 /* Update state */
3139 MBEDTLS_SSL_CHK( ssl_in_server_key_exchange_postprocess( ssl ) );
3140
3141cleanup:
3142
3143#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3144 if( ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS )
3145 ssl->keep_current_message = 1;
3146#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003147
3148 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
Hanno Becker3328b182019-08-12 15:18:29 +01003149 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003150}
3151
Hanno Becker1aa267c2017-04-28 17:08:27 +01003152#if ! defined(MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003153static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003154{
Hanno Becker473f98f2019-06-26 10:27:32 +01003155 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01003156 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003157
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003158 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003159
Hanno Becker1aa267c2017-04-28 17:08:27 +01003160 if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003161 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003162 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003163 ssl->state++;
3164 return( 0 );
3165 }
3166
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003167 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3168 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003169}
Hanno Becker1aa267c2017-04-28 17:08:27 +01003170#else /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003171static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003172{
3173 int ret;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003174 unsigned char *buf;
3175 size_t n = 0;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003176 size_t cert_type_len = 0, dn_len = 0;
Hanno Becker473f98f2019-06-26 10:27:32 +01003177 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01003178 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Paul Bakker5121ce52009-01-03 21:22:43 +00003179
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003180 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003181
Hanno Becker1aa267c2017-04-28 17:08:27 +01003182 if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003183 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003184 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01003185 ssl->state++;
3186 return( 0 );
3187 }
3188
Hanno Becker327c93b2018-08-15 13:56:18 +01003189 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003190 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003191 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3192 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003193 }
3194
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003195 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
3196 {
3197 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01003198 mbedtls_ssl_pend_fatal_alert( ssl,
3199 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003200 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
3201 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003202
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003203 ssl->state++;
3204 ssl->client_auth = ( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST );
Paul Bakker5121ce52009-01-03 21:22:43 +00003205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003206 MBEDTLS_SSL_DEBUG_MSG( 3, ( "got %s certificate request",
Paul Bakker5121ce52009-01-03 21:22:43 +00003207 ssl->client_auth ? "a" : "no" ) );
3208
Paul Bakker926af752012-11-23 13:38:07 +01003209 if( ssl->client_auth == 0 )
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003210 {
3211 /* Current message is probably the ServerHelloDone */
3212 ssl->keep_current_message = 1;
Paul Bakker926af752012-11-23 13:38:07 +01003213 goto exit;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003214 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003215
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02003216 /*
3217 * struct {
3218 * ClientCertificateType certificate_types<1..2^8-1>;
3219 * SignatureAndHashAlgorithm
3220 * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only
3221 * DistinguishedName certificate_authorities<0..2^16-1>;
3222 * } CertificateRequest;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003223 *
3224 * Since we only support a single certificate on clients, let's just
3225 * ignore all the information that's supposed to help us pick a
3226 * certificate.
3227 *
3228 * We could check that our certificate matches the request, and bail out
3229 * if it doesn't, but it's simpler to just send the certificate anyway,
3230 * and give the server the opportunity to decide if it should terminate
3231 * the connection when it doesn't like our certificate.
3232 *
3233 * Same goes for the hash in TLS 1.2's signature_algorithms: at this
3234 * point we only have one hash available (see comments in
Simon Butcherc0957bd2016-03-01 13:16:57 +00003235 * write_certificate_verify), so let's just use what we have.
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003236 *
3237 * However, we still minimally parse the message to check it is at least
3238 * superficially sane.
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02003239 */
Paul Bakker926af752012-11-23 13:38:07 +01003240 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02003241
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003242 /* certificate_types */
Krzysztof Stachowiak73b183c2018-04-05 10:20:09 +02003243 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) )
3244 {
3245 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01003246 mbedtls_ssl_pend_fatal_alert( ssl,
3247 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Krzysztof Stachowiak73b183c2018-04-05 10:20:09 +02003248 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
3249 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003250 cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )];
Paul Bakker926af752012-11-23 13:38:07 +01003251 n = cert_type_len;
3252
Krzysztof Stachowiakbc145f72018-03-20 11:19:50 +01003253 /*
Krzysztof Stachowiak94d49972018-04-05 14:48:55 +02003254 * In the subsequent code there are two paths that read from buf:
Krzysztof Stachowiakbc145f72018-03-20 11:19:50 +01003255 * * the length of the signature algorithms field (if minor version of
3256 * SSL is 3),
3257 * * distinguished name length otherwise.
3258 * Both reach at most the index:
3259 * ...hdr_len + 2 + n,
3260 * therefore the buffer length at this point must be greater than that
3261 * regardless of the actual code path.
3262 */
3263 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
Paul Bakker926af752012-11-23 13:38:07 +01003264 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003265 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01003266 mbedtls_ssl_pend_fatal_alert( ssl,
3267 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003268 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
Paul Bakker926af752012-11-23 13:38:07 +01003269 }
3270
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003271 /* supported_signature_algorithms */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003272#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker2881d802019-05-22 14:44:53 +01003273 if( mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01003274 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003275 size_t sig_alg_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
3276 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
Simon Butcher99000142016-10-13 17:21:01 +01003277#if defined(MBEDTLS_DEBUG_C)
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003278 unsigned char* sig_alg;
Simon Butcher99000142016-10-13 17:21:01 +01003279 size_t i;
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003280#endif
Simon Butcher99000142016-10-13 17:21:01 +01003281
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003282 /*
Krzysztof Stachowiak94d49972018-04-05 14:48:55 +02003283 * The furthest access in buf is in the loop few lines below:
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003284 * sig_alg[i + 1],
3285 * where:
3286 * sig_alg = buf + ...hdr_len + 3 + n,
3287 * max(i) = sig_alg_len - 1.
Krzysztof Stachowiak94d49972018-04-05 14:48:55 +02003288 * Therefore the furthest access is:
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003289 * buf[...hdr_len + 3 + n + sig_alg_len - 1 + 1],
3290 * which reduces to:
3291 * buf[...hdr_len + 3 + n + sig_alg_len],
3292 * which is one less than we need the buf to be.
3293 */
3294 if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n + sig_alg_len )
3295 {
3296 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01003297 mbedtls_ssl_pend_fatal_alert( ssl,
3298 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Krzysztof Stachowiakbc231cc2018-03-20 14:09:53 +01003299 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
3300 }
3301
3302#if defined(MBEDTLS_DEBUG_C)
3303 sig_alg = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n;
Simon Butcher99000142016-10-13 17:21:01 +01003304 for( i = 0; i < sig_alg_len; i += 2 )
3305 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003306 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Supported Signature Algorithm found: %d"
3307 ",%d", sig_alg[i], sig_alg[i + 1] ) );
Simon Butcher99000142016-10-13 17:21:01 +01003308 }
3309#endif
Paul Bakker926af752012-11-23 13:38:07 +01003310
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003311 n += 2 + sig_alg_len;
Paul Bakkerf7abd422013-04-16 13:15:56 +02003312 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003313#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker926af752012-11-23 13:38:07 +01003314
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003315 /* certificate_authorities */
3316 dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
3317 | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01003318
3319 n += dn_len;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00003320 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n )
Paul Bakker926af752012-11-23 13:38:07 +01003321 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003322 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01003323 mbedtls_ssl_pend_fatal_alert( ssl,
3324 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003325 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
Paul Bakker926af752012-11-23 13:38:07 +01003326 }
3327
3328exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003329 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003330
3331 return( 0 );
3332}
Hanno Becker1aa267c2017-04-28 17:08:27 +01003333#endif /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003334
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003335static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003336{
3337 int ret;
3338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003339 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003340
Hanno Becker327c93b2018-08-15 13:56:18 +01003341 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003342 {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003343 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3344 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003345 }
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003346
3347 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
3348 {
3349 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
3350 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
3351 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003352
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003353 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ||
3354 ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003355 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003356 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01003357 mbedtls_ssl_pend_fatal_alert( ssl,
3358 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003359 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003360 }
3361
3362 ssl->state++;
3363
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003364#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02003365 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003366 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003367#endif
3368
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003369 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003370
3371 return( 0 );
3372}
3373
Hanno Becker5d397682018-05-21 12:50:34 +01003374/*
3375 *
3376 * STATE HANDLING: Client Key Exchange
3377 *
3378 */
3379
3380/*
3381 * Overview
3382 */
3383
3384/* Main entry point; orchestrates the other functions */
Hanno Becker7d552fa2019-08-12 15:04:59 +01003385static int ssl_process_out_client_key_exchange( mbedtls_ssl_context *ssl );
Hanno Becker5d397682018-05-21 12:50:34 +01003386
3387/* Preparation
Manuel Pégourié-Gonnard8793fab2019-08-01 10:44:07 +02003388 * - For ECDH: Generate client params and derive premaster secret
Hanno Becker5d397682018-05-21 12:50:34 +01003389 * - For RSA-suites: Encrypt PMS
3390 * - For ECJPAKE: Do Round 2
3391 */
Hanno Becker7d552fa2019-08-12 15:04:59 +01003392static int ssl_out_client_key_exchange_prepare( mbedtls_ssl_context *ssl );
3393static int ssl_out_client_key_exchange_write( mbedtls_ssl_context *ssl,
Hanno Becker5d397682018-05-21 12:50:34 +01003394 unsigned char *buf,
3395 size_t buflen,
3396 size_t *olen );
Hanno Becker7d552fa2019-08-12 15:04:59 +01003397static int ssl_out_client_key_exchange_postprocess( mbedtls_ssl_context *ssl );
Hanno Becker5d397682018-05-21 12:50:34 +01003398
3399/*
3400 * Implementation
3401 */
3402
Hanno Becker7d552fa2019-08-12 15:04:59 +01003403static int ssl_process_out_client_key_exchange( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003404{
Hanno Becker5d397682018-05-21 12:50:34 +01003405 int ret = 0;
3406 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> process client key exchange" ) );
3407
Hanno Becker6fb638b2018-05-21 17:55:44 +01003408#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Hanno Beckerae22dd32019-08-12 14:43:22 +01003409 if( ssl->handshake->ecrs_state == ssl_ecrs_cke_ecdh_calc_secret )
3410 goto cli_key_exchange_postprocess;
Hanno Becker6fb638b2018-05-21 17:55:44 +01003411
Hanno Beckerae22dd32019-08-12 14:43:22 +01003412 if( ssl->handshake->ecrs_enabled )
Hanno Becker6fb638b2018-05-21 17:55:44 +01003413 mbedtls_ecdh_enable_restart( &ssl->handshake->ecdh_ctx );
Hanno Becker6fb638b2018-05-21 17:55:44 +01003414#endif
3415
Hanno Becker7d552fa2019-08-12 15:04:59 +01003416 MBEDTLS_SSL_CHK( ssl_out_client_key_exchange_prepare( ssl ) );
Hanno Becker5d397682018-05-21 12:50:34 +01003417
3418 /* Prepare CertificateVerify message in output buffer. */
Hanno Becker7d552fa2019-08-12 15:04:59 +01003419 MBEDTLS_SSL_CHK( ssl_out_client_key_exchange_write( ssl, ssl->out_msg,
Hanno Becker5d397682018-05-21 12:50:34 +01003420 MBEDTLS_SSL_MAX_CONTENT_LEN,
3421 &ssl->out_msglen ) );
3422
3423 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3424 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE;
3425
Hanno Becker6fb638b2018-05-21 17:55:44 +01003426 /* Calculate secrets and update state */
3427#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Hanno Beckerae22dd32019-08-12 14:43:22 +01003428 if( ssl->handshake->ecrs_enabled )
3429 ssl->handshake->ecrs_state = ssl_ecrs_cke_ecdh_calc_secret;
3430
Hanno Becker6fb638b2018-05-21 17:55:44 +01003431cli_key_exchange_postprocess:
3432#endif
Hanno Beckerae22dd32019-08-12 14:43:22 +01003433
Hanno Becker7d552fa2019-08-12 15:04:59 +01003434 ret = ssl_out_client_key_exchange_postprocess( ssl );
Hanno Beckerae22dd32019-08-12 14:43:22 +01003435#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3436 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3437 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3438#endif /* MBEDTLS_SSL__ECP_RESTARTABLE */
3439 MBEDTLS_SSL_CHK( ret );
Hanno Becker5d397682018-05-21 12:50:34 +01003440
3441 /* Dispatch message */
3442
Hanno Becker868cb582019-07-23 14:29:13 +01003443 MBEDTLS_SSL_CHK( mbedtls_ssl_write_handshake_msg( ssl ) );
Hanno Becker5d397682018-05-21 12:50:34 +01003444
3445 /* NOTE: For the new messaging layer, the postprocessing step
3446 * might come after the dispatching step if the latter
3447 * doesn't send the message immediately.
3448 * At the moment, we must do the postprocessing
3449 * prior to the dispatching because if the latter
3450 * returns WANT_WRITE, we want the handshake state
3451 * to be updated in order to not enter
3452 * this function again on retry. */
3453
3454cleanup:
3455
3456 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= process client key exchange" ) );
3457 return( ret );
3458}
3459
Hanno Becker01290c72018-05-23 13:08:07 +01003460
3461
Hanno Becker7d552fa2019-08-12 15:04:59 +01003462static int ssl_out_client_key_exchange_prepare( mbedtls_ssl_context *ssl )
Hanno Becker5d397682018-05-21 12:50:34 +01003463{
Hanno Becker587c1ae2019-07-25 09:50:25 +01003464 int ret = 0;
Hanno Becker473f98f2019-06-26 10:27:32 +01003465 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01003466 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Paul Bakker5121ce52009-01-03 21:22:43 +00003467
Hanno Becker01290c72018-05-23 13:08:07 +01003468 ((void) ret);
3469 ((void) ciphersuite_info);
3470
3471 /* TODO: The current API for DH and ECDH does not allow
3472 * to separate public key generation from public key export.
3473 *
3474 * Ideally, we would like to pick the private (EC)DH keys
3475 * in this preparation step, exporting the corresponding
3476 * public key in the writing step only.
3477 *
3478 * The necessary extension of the (EC)DH API is being
3479 * considered, but until then we perform the public
3480 * generation + export in the writing step.
3481 *
3482 */
3483
3484#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
3485 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3486 == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
3487 {
3488 /* For RSA-PSK, the premaster secret is composed of
3489 * - Length tag with value 48, encoded as a uint16
3490 * - 2 bytes indicating the TLS version
3491 * - 46 randomly chosen bytes
3492 * - the chosen PSK.
3493 * The following call takes care of all but the PSK. */
3494 ret = ssl_rsa_generate_partial_pms( ssl, ssl->handshake->premaster,
3495 1 /* Add length tag */ );
3496 if( ret != 0 )
3497 return( ret );
3498 }
3499#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3500
3501#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
3502 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3503 == MBEDTLS_KEY_EXCHANGE_RSA )
3504 {
Hanno Becker084694d2019-08-12 14:50:46 +01003505 /* For RSA, the premaster secret is composed of
Hanno Becker01290c72018-05-23 13:08:07 +01003506 * - 2 bytes indicating the TLS version
3507 * - 46 randomly chosen bytes
3508 * which the following call generates. */
3509 ret = ssl_rsa_generate_partial_pms( ssl, ssl->handshake->premaster,
3510 0 /* Omit length tag */ );
3511 if( ret != 0 )
3512 return( ret );
3513 }
3514#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
3515
3516 return( 0 );
Hanno Becker5d397682018-05-21 12:50:34 +01003517}
3518
Hanno Becker4e467092019-08-12 15:12:35 +01003519/* Warning: Despite accepting a length argument, this function is currently
3520 * still lacking some bounds checks and assumes that `buf` has length
3521 * `MBEDTLS_SSL_OUT_CONTENT_LEN`. Eventually, it should be rewritten to work
3522 * with any buffer + length pair, returning MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL
3523 * on insufficient writing space. */
Hanno Becker7d552fa2019-08-12 15:04:59 +01003524static int ssl_out_client_key_exchange_write( mbedtls_ssl_context *ssl,
Hanno Becker5d397682018-05-21 12:50:34 +01003525 unsigned char *buf,
3526 size_t buflen,
3527 size_t *olen )
3528{
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003529 int ret;
3530 unsigned char *p, *end;
3531 size_t n;
3532 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
3533 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
3534
3535 /* NOTE: This function will generate different messages
3536 * when it's called multiple times, because it currently
3537 * includes private/public key generation in case of
3538 * (EC)DH ciphersuites.
3539 *
3540 * It is therefore not suitable to be registered as a callback
3541 * for retransmission, if such get introduced at some point.
3542 *
Hanno Becker7d552fa2019-08-12 15:04:59 +01003543 * Also see the documentation of ssl_out_client_key_exchange_prepare().
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003544 */
3545
3546 p = buf + 4;
3547 end = buf + buflen;
Paul Bakker5121ce52009-01-03 21:22:43 +00003548
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003549#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003550 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3551 == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003552 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003553 /*
3554 * DHM key exchange -- send G^X mod P
3555 */
Paul Bakker48916f92012-09-16 19:57:18 +00003556 n = ssl->handshake->dhm_ctx.len;
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003557 if( (size_t)( end - p ) < n + 2 )
3558 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
Paul Bakker5121ce52009-01-03 21:22:43 +00003559
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003560 p[0] = (unsigned char)( n >> 8 );
3561 p[1] = (unsigned char)( n );
3562 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00003563
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003564 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003565 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
3566 p, n, mbedtls_ssl_conf_get_frng( ssl->conf ),
Hanno Becker9a122432019-07-23 13:24:02 +01003567 mbedtls_ssl_conf_get_prng( ssl->conf ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003568 if( ret != 0 )
3569 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003570 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003571 return( ret );
3572 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003573 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
3574 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00003575
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003576 p += n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003577 }
3578 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003579#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Jarno Lamsae12aafb2019-04-04 18:32:56 +03003580#if defined(MBEDTLS_USE_TINYCRYPT)
3581 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
Hanno Becker621113f2019-07-23 17:01:13 +01003582 == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3583 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3584 == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA )
Jarno Lamsae12aafb2019-04-04 18:32:56 +03003585 {
3586 const struct uECC_Curve_t * uecc_curve = uECC_secp256r1();
Hanno Becker621113f2019-07-23 17:01:13 +01003587 ((void) n);
3588 ((void) ret);
Jarno Lamsae12aafb2019-04-04 18:32:56 +03003589
Hanno Becker621113f2019-07-23 17:01:13 +01003590 if( (size_t)( end - p ) < 2 * NUM_ECC_BYTES + 2 )
3591 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
Jarno Lamsae12aafb2019-04-04 18:32:56 +03003592
Hanno Becker621113f2019-07-23 17:01:13 +01003593 *p++ = 2 * NUM_ECC_BYTES + 1;
3594 *p++ = 0x04; /* uncompressed point presentation */
Hanno Becker8295ff02019-07-24 12:45:52 +01003595
3596 if( !uECC_make_key( p, ssl->handshake->ecdh_privkey,
3597 uecc_curve ) )
3598 {
3599 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3600 }
Hanno Becker621113f2019-07-23 17:01:13 +01003601 p += 2 * NUM_ECC_BYTES;
Jarno Lamsae12aafb2019-04-04 18:32:56 +03003602 }
3603 else
Hanno Becker29d16552019-07-24 11:11:45 +01003604#endif /* MBEDTLS_USE_TINYCRYPT */
3605#if defined(MBEDTLS_ECDH_C) && \
3606 ( defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3607 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3608 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3609 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) )
Hanno Becker473f98f2019-06-26 10:27:32 +01003610 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003611 == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Hanno Becker473f98f2019-06-26 10:27:32 +01003612 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003613 == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
Hanno Becker473f98f2019-06-26 10:27:32 +01003614 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003615 == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Hanno Becker473f98f2019-06-26 10:27:32 +01003616 mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3617 == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01003618 {
3619 /*
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003620 * ECDH key exchange -- generate and send client public value
Paul Bakker41c83d32013-03-20 14:39:14 +01003621 */
Paul Bakker41c83d32013-03-20 14:39:14 +01003622
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003623 /* NOTE: If we ever switch the ECDH stack/API to allow
3624 * independent key generation and export, we should have
3625 * generated our key share in the preparation step, and
3626 * we'd only do the export here. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003627 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003628 &n, p, end - p,
Hanno Beckerece325c2019-06-13 15:39:27 +01003629 mbedtls_ssl_conf_get_frng( ssl->conf ),
Hanno Becker9a122432019-07-23 13:24:02 +01003630 mbedtls_ssl_conf_get_prng( ssl->conf ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01003631 if( ret != 0 )
3632 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003633 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02003634#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3635 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3636 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3637#endif
Paul Bakker41c83d32013-03-20 14:39:14 +01003638 return( ret );
3639 }
3640
Janos Follath3fbdada2018-08-15 10:26:53 +01003641 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3642 MBEDTLS_DEBUG_ECDH_Q );
Paul Bakker41c83d32013-03-20 14:39:14 +01003643
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003644 p += n;
Paul Bakker41c83d32013-03-20 14:39:14 +01003645 }
3646 else
Hanno Becker29d16552019-07-24 11:11:45 +01003647#endif /* MBEDTLS_ECDH_C && (
3648 ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3649 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3650 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3651 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED ) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003652#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Hanno Becker1aa267c2017-04-28 17:08:27 +01003653 if( mbedtls_ssl_ciphersuite_uses_psk( ciphersuite_info ) )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003654 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003655 /*
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003656 * opaque psk_identity<0..2^16-1>;
3657 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003658 if( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL )
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003659 {
3660 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for PSK" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003661 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003662 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003663
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003664 n = ssl->conf->psk_identity_len;
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003665 if( buflen < n + 2 )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003666 {
3667 MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity too long or "
3668 "SSL buffer too short" ) );
3669 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3670 }
3671
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003672 p[0] = (unsigned char)( n >> 8 );
3673 p[1] = (unsigned char)( n );
3674 p += 2;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003675
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003676 memcpy( p, ssl->conf->psk_identity, n );
3677 p += ssl->conf->psk_identity_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003678
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003679#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003680 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3681 == MBEDTLS_KEY_EXCHANGE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003682 {
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003683 ((void) ret);
3684 ((void) end);
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003685 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003686 else
3687#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003688#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003689 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3690 == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003691 {
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003692 if( ( ret = ssl_rsa_encrypt_partial_pms( ssl,
3693 ssl->handshake->premaster + 2,
3694 p, end - p, &n ) ) != 0 )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003695 return( ret );
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003696 p += n;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003697 }
3698 else
3699#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003700#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003701 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3702 == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003703 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003704 /*
3705 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
3706 */
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003707 ((void) end);
3708
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003709 n = ssl->handshake->dhm_ctx.len;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003710
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003711 if( buflen < n + 2 )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003712 {
3713 MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity or DHM size too long"
3714 " or SSL buffer too short" ) );
3715 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3716 }
3717
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003718 p[0] = (unsigned char)( n >> 8 );
3719 p[1] = (unsigned char)( n );
3720 p += 2;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003721
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003722 ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003723 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
3724 p, n, mbedtls_ssl_conf_get_frng( ssl->conf ),
Hanno Becker9a122432019-07-23 13:24:02 +01003725 mbedtls_ssl_conf_get_prng( ssl->conf ) );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003726 if( ret != 0 )
3727 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003728 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003729 return( ret );
3730 }
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003731
3732 p += n;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003733 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003734 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003735#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
3736#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Hanno Becker473f98f2019-06-26 10:27:32 +01003737 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3738 == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003739 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003740 /*
3741 * ClientECDiffieHellmanPublic public;
3742 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003743 ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n,
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003744 p, buflen,
3745 mbedtls_ssl_conf_get_frng( ssl->conf ),
Hanno Becker9a122432019-07-23 13:24:02 +01003746 mbedtls_ssl_conf_get_prng( ssl->conf ) );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003747 if( ret != 0 )
3748 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003749 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003750 return( ret );
3751 }
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003752 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003753
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003754 p += n;
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003755 }
3756 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003757#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003758 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003759 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3760 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003761 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003762 }
3763 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003764#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
3765#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003766 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3767 == MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003768 {
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003769 if( ( ret = ssl_rsa_encrypt_partial_pms( ssl, ssl->handshake->premaster,
3770 p, end - p, &n ) ) != 0 )
Paul Bakkera3d195c2011-11-27 21:07:34 +00003771 return( ret );
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003772 p += n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003773 }
Paul Bakkered27a042013-04-18 22:46:23 +02003774 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003775#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003776#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003777 if( mbedtls_ssl_suite_get_key_exchange( ciphersuite_info )
3778 == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003779 {
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003780 ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003781 p, end - p, &n,
3782 mbedtls_ssl_conf_get_frng( ssl->conf ),
Hanno Becker9a122432019-07-23 13:24:02 +01003783 mbedtls_ssl_conf_get_prng( ssl->conf ) );
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003784 if( ret != 0 )
3785 {
3786 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
3787 return( ret );
3788 }
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003789 p += n;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003790 }
3791 else
3792#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02003793 {
3794 ((void) ciphersuite_info);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003795 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3796 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakkered27a042013-04-18 22:46:23 +02003797 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003798
Hanno Becker87e3c9a2018-05-23 13:13:04 +01003799 *olen = p - buf;
3800 return( 0 );
Hanno Becker5d397682018-05-21 12:50:34 +01003801}
Paul Bakker5121ce52009-01-03 21:22:43 +00003802
Hanno Becker7d552fa2019-08-12 15:04:59 +01003803static int ssl_out_client_key_exchange_postprocess( mbedtls_ssl_context *ssl )
Hanno Becker5d397682018-05-21 12:50:34 +01003804{
Hanno Becker6fb638b2018-05-21 17:55:44 +01003805 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003806
Hanno Becker09d23642019-07-22 17:18:18 +01003807 if( ( ret = mbedtls_ssl_build_pms( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003808 {
Hanno Becker09d23642019-07-22 17:18:18 +01003809 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_build_pms", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003810 return( ret );
3811 }
3812
Hanno Becker6fb638b2018-05-21 17:55:44 +01003813 ssl->state = MBEDTLS_SSL_CERTIFICATE_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00003814 return( 0 );
3815}
3816
Hanno Beckerae39b9e2019-02-07 12:32:43 +00003817#if !defined(MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003818static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003819{
Hanno Becker473f98f2019-06-26 10:27:32 +01003820 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01003821 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003822 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003823
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003824 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003825
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003826 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003827 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003828 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003829 return( ret );
3830 }
3831
Hanno Beckerae39b9e2019-02-07 12:32:43 +00003832 if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Paul Bakkered27a042013-04-18 22:46:23 +02003833 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003834 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakkered27a042013-04-18 22:46:23 +02003835 ssl->state++;
3836 return( 0 );
3837 }
3838
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003839 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3840 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003841}
Hanno Beckerae39b9e2019-02-07 12:32:43 +00003842#else /* !MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003843static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003844{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003845 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker473f98f2019-06-26 10:27:32 +01003846 mbedtls_ssl_ciphersuite_handle_t ciphersuite_info =
Hanno Beckerdf645962019-06-26 13:02:22 +01003847 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003848 size_t n = 0, offset = 0;
3849 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003850 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003851 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnarda5759752019-05-03 11:43:28 +02003852 size_t hashlen;
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003853 void *rs_ctx = NULL;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003854
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003855 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003856
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003857#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003858 if( ssl->handshake->ecrs_enabled &&
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003859 ssl->handshake->ecrs_state == ssl_ecrs_crt_vrfy_sign )
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003860 {
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003861 goto sign;
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003862 }
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003863#endif
3864
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003865 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003866 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003867 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003868 return( ret );
3869 }
3870
Hanno Beckerae39b9e2019-02-07 12:32:43 +00003871 if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003872 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003873 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003874 ssl->state++;
3875 return( 0 );
3876 }
3877
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003878 if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003879 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003880 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003881 ssl->state++;
3882 return( 0 );
3883 }
3884
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003885 if( mbedtls_ssl_own_key( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003886 {
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003887 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for certificate" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003888 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003889 }
3890
3891 /*
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003892 * Make a signature of the handshake digests
Paul Bakker5121ce52009-01-03 21:22:43 +00003893 */
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003894#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3895 if( ssl->handshake->ecrs_enabled )
3896 ssl->handshake->ecrs_state = ssl_ecrs_crt_vrfy_sign;
3897
3898sign:
3899#endif
3900
Hanno Becker2f41b242019-08-15 17:29:43 +01003901 mbedtls_ssl_calc_verify(
3902 mbedtls_ssl_get_minor_ver( ssl ),
3903 mbedtls_ssl_suite_get_mac( ciphersuite_info ),
3904 ssl, hash, &hashlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00003905
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003906#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3907 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Hanno Becker2881d802019-05-22 14:44:53 +01003908 if( mbedtls_ssl_get_minor_ver( ssl ) != MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003909 {
Paul Bakker926af752012-11-23 13:38:07 +01003910 /*
3911 * digitally-signed struct {
3912 * opaque md5_hash[16];
3913 * opaque sha_hash[20];
3914 * };
3915 *
3916 * md5_hash
3917 * MD5(handshake_messages);
3918 *
3919 * sha_hash
3920 * SHA(handshake_messages);
3921 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003922 md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003923
3924 /*
3925 * For ECDSA, default hash is SHA-1 only
3926 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003927 if( mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003928 {
3929 hash_start += 16;
3930 hashlen -= 16;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003931 md_alg = MBEDTLS_MD_SHA1;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003932 }
Paul Bakker926af752012-11-23 13:38:07 +01003933 }
3934 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003935#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
3936 MBEDTLS_SSL_PROTO_TLS1_1 */
3937#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker2881d802019-05-22 14:44:53 +01003938 if( mbedtls_ssl_get_minor_ver( ssl ) == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01003939 {
3940 /*
3941 * digitally-signed struct {
3942 * opaque handshake_messages[handshake_messages_length];
3943 * };
3944 *
3945 * Taking shortcut here. We assume that the server always allows the
3946 * PRF Hash function and has sent it in the allowed signature
3947 * algorithms list received in the Certificate Request message.
3948 *
3949 * Until we encounter a server that does not, we will take this
3950 * shortcut.
3951 *
3952 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
3953 * in order to satisfy 'weird' needs from the server side.
3954 */
Hanno Beckerdf645962019-06-26 13:02:22 +01003955 if( mbedtls_ssl_suite_get_mac(
3956 mbedtls_ssl_handshake_get_ciphersuite( ssl->handshake ) )
Hanno Becker473f98f2019-06-26 10:27:32 +01003957 == MBEDTLS_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00003958 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003959 md_alg = MBEDTLS_MD_SHA384;
3960 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00003961 }
3962 else
3963 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003964 md_alg = MBEDTLS_MD_SHA256;
3965 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00003966 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003967 ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003968
Manuel Pégourié-Gonnardbfe32ef2013-08-22 14:55:30 +02003969 /* Info from md_alg will be used instead */
3970 hashlen = 0;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003971 offset = 2;
3972 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003973 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003974#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02003975 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003976 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3977 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02003978 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003979
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003980#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003981 if( ssl->handshake->ecrs_enabled )
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +02003982 rs_ctx = &ssl->handshake->ecrs_ctx.pk;
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003983#endif
3984
3985 if( ( ret = mbedtls_pk_sign_restartable( mbedtls_ssl_own_key( ssl ),
3986 md_alg, hash_start, hashlen,
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003987 ssl->out_msg + 6 + offset, &n,
Hanno Beckerece325c2019-06-13 15:39:27 +01003988 mbedtls_ssl_conf_get_frng( ssl->conf ),
Hanno Becker9a122432019-07-23 13:24:02 +01003989 mbedtls_ssl_conf_get_prng( ssl->conf ), rs_ctx ) ) != 0 )
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02003990 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003991 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02003992#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3993 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3994 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3995#endif
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003996 return( ret );
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02003997 }
Paul Bakker926af752012-11-23 13:38:07 +01003998
Paul Bakker1ef83d62012-04-11 12:09:53 +00003999 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
4000 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00004001
Paul Bakker1ef83d62012-04-11 12:09:53 +00004002 ssl->out_msglen = 6 + n + offset;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004003 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4004 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00004005
4006 ssl->state++;
4007
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02004008 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00004009 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02004010 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004011 return( ret );
4012 }
4013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004014 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004015
Paul Bakkered27a042013-04-18 22:46:23 +02004016 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004017}
Hanno Beckerae39b9e2019-02-07 12:32:43 +00004018#endif /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004019
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004020#if defined(MBEDTLS_SSL_SESSION_TICKETS)
4021static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004022{
4023 int ret;
4024 uint32_t lifetime;
4025 size_t ticket_len;
4026 unsigned char *ticket;
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02004027 const unsigned char *msg;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004028
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004029 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004030
Hanno Becker327c93b2018-08-15 13:56:18 +01004031 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004032 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004033 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004034 return( ret );
4035 }
4036
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004037 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004038 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004039 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01004040 mbedtls_ssl_pend_fatal_alert( ssl,
4041 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004042 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004043 }
4044
4045 /*
4046 * struct {
4047 * uint32 ticket_lifetime_hint;
4048 * opaque ticket<0..2^16-1>;
4049 * } NewSessionTicket;
4050 *
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02004051 * 0 . 3 ticket_lifetime_hint
4052 * 4 . 5 ticket_len (n)
4053 * 6 . 5+n ticket content
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004054 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004055 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET ||
4056 ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004057 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004058 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01004059 mbedtls_ssl_pend_fatal_alert( ssl,
4060 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004061 return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004062 }
4063
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004064 msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004065
Philippe Antoineb5b25432018-05-11 11:06:29 +02004066 lifetime = ( ((uint32_t) msg[0]) << 24 ) | ( msg[1] << 16 ) |
4067 ( msg[2] << 8 ) | ( msg[3] );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004068
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02004069 ticket_len = ( msg[4] << 8 ) | ( msg[5] );
4070
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004071 if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004072 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004073 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01004074 mbedtls_ssl_pend_fatal_alert( ssl,
4075 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004076 return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004077 }
4078
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004079 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004080
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02004081 /* We're not waiting for a NewSessionTicket message any more */
4082 ssl->handshake->new_session_ticket = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004083 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02004084
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004085 /*
4086 * Zero-length ticket means the server changed his mind and doesn't want
4087 * to send a ticket after all, so just forget it
4088 */
Paul Bakker66d5d072014-06-17 16:39:18 +02004089 if( ticket_len == 0 )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004090 return( 0 );
4091
Hanno Becker3d699e42019-01-30 14:46:35 +00004092 if( ssl->session != NULL && ssl->session->ticket != NULL )
4093 {
4094 mbedtls_platform_zeroize( ssl->session->ticket,
4095 ssl->session->ticket_len );
4096 mbedtls_free( ssl->session->ticket );
4097 ssl->session->ticket = NULL;
4098 ssl->session->ticket_len = 0;
4099 }
4100
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004101 mbedtls_platform_zeroize( ssl->session_negotiate->ticket,
4102 ssl->session_negotiate->ticket_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004103 mbedtls_free( ssl->session_negotiate->ticket );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004104 ssl->session_negotiate->ticket = NULL;
4105 ssl->session_negotiate->ticket_len = 0;
4106
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02004107 if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004108 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02004109 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) );
Hanno Beckerde62da92019-07-24 13:23:50 +01004110 mbedtls_ssl_pend_fatal_alert( ssl,
4111 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02004112 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004113 }
4114
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02004115 memcpy( ticket, msg + 6, ticket_len );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004116
4117 ssl->session_negotiate->ticket = ticket;
4118 ssl->session_negotiate->ticket_len = ticket_len;
4119 ssl->session_negotiate->ticket_lifetime = lifetime;
4120
4121 /*
4122 * RFC 5077 section 3.4:
4123 * "If the client receives a session ticket from the server, then it
4124 * discards any Session ID that was sent in the ServerHello."
4125 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004126 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02004127 ssl->session_negotiate->id_len = 0;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004128
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004129 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004130
4131 return( 0 );
4132}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004133#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004134
Paul Bakker5121ce52009-01-03 21:22:43 +00004135/*
Paul Bakker1961b702013-01-25 14:49:24 +01004136 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004137 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004138int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00004139{
4140 int ret = 0;
4141
Manuel Pégourié-Gonnarddba460f2015-06-24 22:59:30 +02004142 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004143 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00004144
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004145 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
Paul Bakker1961b702013-01-25 14:49:24 +01004146
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004147 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
Paul Bakker1961b702013-01-25 14:49:24 +01004148 return( ret );
4149
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004150#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard64c16812019-06-06 12:43:51 +02004151 if( MBEDTLS_SSL_TRANSPORT_IS_DTLS( ssl->conf->transport ) &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004152 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02004153 {
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02004154 if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02004155 return( ret );
4156 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01004157#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02004158
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004159 /* Change state now, so that it is right in mbedtls_ssl_read_record(), used
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02004160 * by DTLS for dropping out-of-sequence ChangeCipherSpec records */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004161#if defined(MBEDTLS_SSL_SESSION_TICKETS)
4162 if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02004163 ssl->handshake->new_session_ticket != 0 )
4164 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004165 ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02004166 }
4167#endif
4168
Paul Bakker1961b702013-01-25 14:49:24 +01004169 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00004170 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004171 case MBEDTLS_SSL_HELLO_REQUEST:
4172 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004173 break;
4174
Paul Bakker1961b702013-01-25 14:49:24 +01004175 /*
4176 * ==> ClientHello
4177 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004178 case MBEDTLS_SSL_CLIENT_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01004179 ret = ssl_write_client_hello( ssl );
4180 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004181
Paul Bakker1961b702013-01-25 14:49:24 +01004182 /*
4183 * <== ServerHello
4184 * Certificate
4185 * ( ServerKeyExchange )
4186 * ( CertificateRequest )
4187 * ServerHelloDone
4188 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004189 case MBEDTLS_SSL_SERVER_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01004190 ret = ssl_parse_server_hello( ssl );
4191 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004192
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004193 case MBEDTLS_SSL_SERVER_CERTIFICATE:
4194 ret = mbedtls_ssl_parse_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004195 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004196
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004197 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Hanno Becker7d552fa2019-08-12 15:04:59 +01004198 ret = ssl_process_in_server_key_exchange( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004199 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004200
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004201 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Paul Bakker1961b702013-01-25 14:49:24 +01004202 ret = ssl_parse_certificate_request( ssl );
4203 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004204
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004205 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Paul Bakker1961b702013-01-25 14:49:24 +01004206 ret = ssl_parse_server_hello_done( ssl );
4207 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004208
Paul Bakker1961b702013-01-25 14:49:24 +01004209 /*
4210 * ==> ( Certificate/Alert )
4211 * ClientKeyExchange
4212 * ( CertificateVerify )
4213 * ChangeCipherSpec
4214 * Finished
4215 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004216 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
4217 ret = mbedtls_ssl_write_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004218 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004219
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004220 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Hanno Becker7d552fa2019-08-12 15:04:59 +01004221 ret = ssl_process_out_client_key_exchange( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004222 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004223
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004224 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Paul Bakker1961b702013-01-25 14:49:24 +01004225 ret = ssl_write_certificate_verify( ssl );
4226 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004227
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004228 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
4229 ret = mbedtls_ssl_write_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004230 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004232 case MBEDTLS_SSL_CLIENT_FINISHED:
4233 ret = mbedtls_ssl_write_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004234 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004235
Paul Bakker1961b702013-01-25 14:49:24 +01004236 /*
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02004237 * <== ( NewSessionTicket )
4238 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004239 * Finished
4240 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004241#if defined(MBEDTLS_SSL_SESSION_TICKETS)
4242 case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02004243 ret = ssl_parse_new_session_ticket( ssl );
4244 break;
Paul Bakkera503a632013-08-14 13:48:06 +02004245#endif
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02004246
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004247 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4248 ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004249 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004250
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004251 case MBEDTLS_SSL_SERVER_FINISHED:
4252 ret = mbedtls_ssl_parse_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004253 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004254
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004255 case MBEDTLS_SSL_FLUSH_BUFFERS:
4256 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
4257 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004258 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00004259
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004260 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
4261 mbedtls_ssl_handshake_wrapup( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004262 break;
Paul Bakker48916f92012-09-16 19:57:18 +00004263
Paul Bakker1961b702013-01-25 14:49:24 +01004264 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004265 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
4266 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker1961b702013-01-25 14:49:24 +01004267 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004268
4269 return( ret );
4270}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004271#endif /* MBEDTLS_SSL_CLI_C */