blob: 9bfda164aff311a92955c159f32a7620bc9c774c [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 server-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_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000029
SimonBd5800b72016-04-26 07:43:27 +010030#if defined(MBEDTLS_PLATFORM_C)
31#include "mbedtls/platform.h"
32#else
33#include <stdlib.h>
34#define mbedtls_calloc calloc
35#define mbedtls_free free
SimonBd5800b72016-04-26 07:43:27 +010036#endif
37
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000038#include "mbedtls/ssl.h"
Manuel Pégourié-Gonnard5e94dde2015-05-26 11:57:05 +020039#include "mbedtls/ssl_internal.h"
Janos Follath73c616b2019-12-18 15:07:04 +000040#include "mbedtls/debug.h"
41#include "mbedtls/error.h"
Andres Amaya Garcia84914062018-04-24 08:40:46 -050042#include "mbedtls/platform_util.h"
Rich Evans00ab4702015-02-06 13:43:58 +000043
44#include <string.h>
45
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000047#include "mbedtls/ecp.h"
Paul Bakker41c83d32013-03-20 14:39:14 +010048#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000049
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010051#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020052#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000053
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
55int mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020056 const unsigned char *info,
57 size_t ilen )
58{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +020059 if( ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020060 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020061
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020062 mbedtls_free( ssl->cli_id );
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020063
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +020064 if( ( ssl->cli_id = mbedtls_calloc( 1, ilen ) ) == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +020065 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020066
67 memcpy( ssl->cli_id, info, ilen );
68 ssl->cli_id_len = ilen;
69
70 return( 0 );
71}
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020072
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +020073void mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020074 mbedtls_ssl_cookie_write_t *f_cookie_write,
75 mbedtls_ssl_cookie_check_t *f_cookie_check,
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020076 void *p_cookie )
77{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +020078 conf->f_cookie_write = f_cookie_write;
79 conf->f_cookie_check = f_cookie_check;
80 conf->p_cookie = p_cookie;
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020081}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020082#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020083
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020084#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020085static int ssl_parse_servername_ext( mbedtls_ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +000086 const unsigned char *buf,
Paul Bakker5701cdc2012-09-27 21:49:42 +000087 size_t len )
88{
Janos Follath865b3eb2019-12-16 11:46:15 +000089 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5701cdc2012-09-27 21:49:42 +000090 size_t servername_list_size, hostname_len;
Paul Bakker23f36802012-09-28 14:15:14 +000091 const unsigned char *p;
Paul Bakker5701cdc2012-09-27 21:49:42 +000092
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020093 MBEDTLS_SSL_DEBUG_MSG( 3, ( "parse ServerName extension" ) );
Manuel Pégourié-Gonnard96ea2f22014-02-25 12:26:29 +010094
Philippe Antoine747fd532018-05-30 09:13:21 +020095 if( len < 2 )
96 {
97 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
98 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
99 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
100 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
101 }
Paul Bakker5701cdc2012-09-27 21:49:42 +0000102 servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
103 if( servername_list_size + 2 != len )
104 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200105 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200106 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
107 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200108 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000109 }
110
111 p = buf + 2;
Philippe Antoine747fd532018-05-30 09:13:21 +0200112 while( servername_list_size > 2 )
Paul Bakker5701cdc2012-09-27 21:49:42 +0000113 {
114 hostname_len = ( ( p[1] << 8 ) | p[2] );
115 if( hostname_len + 3 > servername_list_size )
116 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200117 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200118 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
119 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200120 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000121 }
122
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200123 if( p[0] == MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME )
Paul Bakker5701cdc2012-09-27 21:49:42 +0000124 {
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +0200125 ret = ssl->conf->f_sni( ssl->conf->p_sni,
126 ssl, p + 3, hostname_len );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000127 if( ret != 0 )
128 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200129 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_sni_wrapper", ret );
130 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
131 MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME );
132 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000133 }
Paul Bakker81420ab2012-10-23 10:31:15 +0000134 return( 0 );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000135 }
136
137 servername_list_size -= hostname_len + 3;
Paul Bakker23f36802012-09-28 14:15:14 +0000138 p += hostname_len + 3;
139 }
140
141 if( servername_list_size != 0 )
142 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200143 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200144 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
145 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200146 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000147 }
148
149 return( 0 );
150}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +0000152
Gilles Peskineeccd8882020-03-10 12:19:08 +0100153#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Hanno Becker845b9462018-10-26 12:07:29 +0100154static int ssl_conf_has_psk_or_cb( mbedtls_ssl_config const *conf )
155{
156 if( conf->f_psk != NULL )
157 return( 1 );
158
159 if( conf->psk_identity_len == 0 || conf->psk_identity == NULL )
160 return( 0 );
161
162 if( conf->psk != NULL && conf->psk_len != 0 )
163 return( 1 );
164
165#if defined(MBEDTLS_USE_PSA_CRYPTO)
166 if( conf->psk_opaque != 0 )
167 return( 1 );
168#endif /* MBEDTLS_USE_PSA_CRYPTO */
169
170 return( 0 );
171}
172
173#if defined(MBEDTLS_USE_PSA_CRYPTO)
174static int ssl_use_opaque_psk( mbedtls_ssl_context const *ssl )
175{
176 if( ssl->conf->f_psk != NULL )
177 {
178 /* If we've used a callback to select the PSK,
179 * the static configuration is irrelevant. */
180
181 if( ssl->handshake->psk_opaque != 0 )
182 return( 1 );
183
184 return( 0 );
185 }
186
187 if( ssl->conf->psk_opaque != 0 )
188 return( 1 );
189
190 return( 0 );
191}
192#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskineeccd8882020-03-10 12:19:08 +0100193#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Hanno Becker845b9462018-10-26 12:07:29 +0100194
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200195static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +0000196 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +0000197 size_t len )
198{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200199#if defined(MBEDTLS_SSL_RENEGOTIATION)
200 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100201 {
202 /* Check verify-data in constant-time. The length OTOH is no secret */
203 if( len != 1 + ssl->verify_data_len ||
204 buf[0] != ssl->verify_data_len ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200205 mbedtls_ssl_safer_memcmp( buf + 1, ssl->peer_verify_data,
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100206 ssl->verify_data_len ) != 0 )
207 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200208 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +0200209 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
210 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200211 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100212 }
213 }
214 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200215#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +0000216 {
217 if( len != 1 || buf[0] != 0x0 )
218 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200219 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +0200220 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
221 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200222 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +0000223 }
224
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200225 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +0000226 }
Paul Bakker48916f92012-09-16 19:57:18 +0000227
228 return( 0 );
229}
230
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200231#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +0100232 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100233
234/*
235 * Status of the implementation of signature-algorithms extension:
236 *
237 * Currently, we are only considering the signature-algorithm extension
238 * to pick a ciphersuite which allows us to send the ServerKeyExchange
239 * message with a signature-hash combination that the user allows.
240 *
241 * We do *not* check whether all certificates in our certificate
242 * chain are signed with an allowed signature-hash pair.
243 * This needs to be done at a later stage.
244 *
245 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200246static int ssl_parse_signature_algorithms_ext( mbedtls_ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +0000247 const unsigned char *buf,
248 size_t len )
249{
250 size_t sig_alg_list_size;
Hanno Becker7e5437a2017-04-28 17:15:26 +0100251
Paul Bakker23f36802012-09-28 14:15:14 +0000252 const unsigned char *p;
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200253 const unsigned char *end = buf + len;
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200254
Hanno Becker7e5437a2017-04-28 17:15:26 +0100255 mbedtls_md_type_t md_cur;
256 mbedtls_pk_type_t sig_cur;
Paul Bakker23f36802012-09-28 14:15:14 +0000257
Philippe Antoine747fd532018-05-30 09:13:21 +0200258 if ( len < 2 ) {
259 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
260 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
261 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
262 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
263 }
Paul Bakker23f36802012-09-28 14:15:14 +0000264 sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
265 if( sig_alg_list_size + 2 != len ||
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200266 sig_alg_list_size % 2 != 0 )
Paul Bakker23f36802012-09-28 14:15:14 +0000267 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200268 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200269 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
270 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200271 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker23f36802012-09-28 14:15:14 +0000272 }
273
Hanno Becker7e5437a2017-04-28 17:15:26 +0100274 /* Currently we only guarantee signing the ServerKeyExchange message according
275 * to the constraints specified in this extension (see above), so it suffices
276 * to remember only one suitable hash for each possible signature algorithm.
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200277 *
Hanno Becker7e5437a2017-04-28 17:15:26 +0100278 * This will change when we also consider certificate signatures,
279 * in which case we will need to remember the whole signature-hash
280 * pair list from the extension.
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200281 */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100282
283 for( p = buf + 2; p < end; p += 2 )
284 {
285 /* Silently ignore unknown signature or hash algorithms. */
286
287 if( ( sig_cur = mbedtls_ssl_pk_alg_from_sig( p[1] ) ) == MBEDTLS_PK_NONE )
288 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100289 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext"
290 " unknown sig alg encoding %d", p[1] ) );
Hanno Becker7e5437a2017-04-28 17:15:26 +0100291 continue;
292 }
293
294 /* Check if we support the hash the user proposes */
295 md_cur = mbedtls_ssl_md_alg_from_hash( p[0] );
296 if( md_cur == MBEDTLS_MD_NONE )
297 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100298 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext:"
299 " unknown hash alg encoding %d", p[0] ) );
Hanno Becker7e5437a2017-04-28 17:15:26 +0100300 continue;
301 }
302
303 if( mbedtls_ssl_check_sig_hash( ssl, md_cur ) == 0 )
304 {
305 mbedtls_ssl_sig_hash_set_add( &ssl->handshake->hash_algs, sig_cur, md_cur );
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100306 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext:"
307 " match sig %d and hash %d",
Hanno Becker7e5437a2017-04-28 17:15:26 +0100308 sig_cur, md_cur ) );
309 }
310 else
311 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100312 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: "
313 "hash alg %d not supported", md_cur ) );
Paul Bakker23f36802012-09-28 14:15:14 +0000314 }
Paul Bakker23f36802012-09-28 14:15:14 +0000315 }
316
Paul Bakker23f36802012-09-28 14:15:14 +0000317 return( 0 );
318}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200319#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
Gilles Peskineeccd8882020-03-10 12:19:08 +0100320 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker23f36802012-09-28 14:15:14 +0000321
Robert Cragie136884c2015-10-02 13:34:31 +0100322#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100323 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200324static int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200325 const unsigned char *buf,
326 size_t len )
Paul Bakker41c83d32013-03-20 14:39:14 +0100327{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200328 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100329 const unsigned char *p;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200330 const mbedtls_ecp_curve_info *curve_info, **curves;
Paul Bakker41c83d32013-03-20 14:39:14 +0100331
Philippe Antoine747fd532018-05-30 09:13:21 +0200332 if ( len < 2 ) {
333 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
334 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
335 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
336 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
337 }
Paul Bakker41c83d32013-03-20 14:39:14 +0100338 list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
339 if( list_size + 2 != len ||
340 list_size % 2 != 0 )
341 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200342 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200343 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
344 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200345 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker41c83d32013-03-20 14:39:14 +0100346 }
347
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200348 /* Should never happen unless client duplicates the extension */
349 if( ssl->handshake->curves != NULL )
350 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200351 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200352 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
353 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200354 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200355 }
356
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100357 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200358 * and leave room for a final 0 */
359 our_size = list_size / 2 + 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200360 if( our_size > MBEDTLS_ECP_DP_MAX )
361 our_size = MBEDTLS_ECP_DP_MAX;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200362
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200363 if( ( curves = mbedtls_calloc( our_size, sizeof( *curves ) ) ) == NULL )
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200364 {
365 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
366 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200367 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200368 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200369
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200370 ssl->handshake->curves = curves;
371
Paul Bakker41c83d32013-03-20 14:39:14 +0100372 p = buf + 2;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200373 while( list_size > 0 && our_size > 1 )
Paul Bakker41c83d32013-03-20 14:39:14 +0100374 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 curve_info = mbedtls_ecp_curve_info_from_tls_id( ( p[0] << 8 ) | p[1] );
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200376
Manuel Pégourié-Gonnardf24b4a72013-09-23 18:14:50 +0200377 if( curve_info != NULL )
Paul Bakker41c83d32013-03-20 14:39:14 +0100378 {
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200379 *curves++ = curve_info;
380 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100381 }
382
383 list_size -= 2;
384 p += 2;
385 }
386
387 return( 0 );
388}
389
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200390static int ssl_parse_supported_point_formats( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200391 const unsigned char *buf,
392 size_t len )
Paul Bakker41c83d32013-03-20 14:39:14 +0100393{
394 size_t list_size;
395 const unsigned char *p;
396
Philippe Antoine747fd532018-05-30 09:13:21 +0200397 if( len == 0 || (size_t)( buf[0] + 1 ) != len )
Paul Bakker41c83d32013-03-20 14:39:14 +0100398 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200399 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200400 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
401 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200402 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker41c83d32013-03-20 14:39:14 +0100403 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200404 list_size = buf[0];
Paul Bakker41c83d32013-03-20 14:39:14 +0100405
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200406 p = buf + 1;
Paul Bakker41c83d32013-03-20 14:39:14 +0100407 while( list_size > 0 )
408 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
410 p[0] == MBEDTLS_ECP_PF_COMPRESSED )
Paul Bakker41c83d32013-03-20 14:39:14 +0100411 {
Robert Cragie136884c2015-10-02 13:34:31 +0100412#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200413 ssl->handshake->ecdh_ctx.point_format = p[0];
Robert Cragie136884c2015-10-02 13:34:31 +0100414#endif
Robert Cragieae8535d2015-10-06 17:11:18 +0100415#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Robert Cragie136884c2015-10-02 13:34:31 +0100416 ssl->handshake->ecjpake_ctx.point_format = p[0];
417#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200418 MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
Paul Bakker41c83d32013-03-20 14:39:14 +0100419 return( 0 );
420 }
421
422 list_size--;
423 p++;
424 }
425
426 return( 0 );
427}
Robert Cragieae8535d2015-10-06 17:11:18 +0100428#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
429 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100430
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200431#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
432static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
433 const unsigned char *buf,
434 size_t len )
435{
Janos Follath865b3eb2019-12-16 11:46:15 +0000436 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200437
438 if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
439 {
440 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
441 return( 0 );
442 }
443
444 if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
445 buf, len ) ) != 0 )
446 {
447 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200448 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
449 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200450 return( ret );
451 }
452
453 /* Only mark the extension as OK when we're sure it is */
454 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
455
456 return( 0 );
457}
458#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
459
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200460#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
461static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200462 const unsigned char *buf,
463 size_t len )
464{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200465 if( len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID )
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200466 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200467 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200468 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
469 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200470 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200471 }
472
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200473 ssl->session_negotiate->mfl_code = buf[0];
474
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200475 return( 0 );
476}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200477#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200478
Hanno Beckera0e20d02019-05-15 14:03:01 +0100479#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +0100480static int ssl_parse_cid_ext( mbedtls_ssl_context *ssl,
481 const unsigned char *buf,
482 size_t len )
483{
484 size_t peer_cid_len;
485
486 /* CID extension only makes sense in DTLS */
487 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
488 {
489 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
490 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
491 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
492 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
493 }
494
495 /*
Hanno Beckerebcc9132019-05-15 10:26:32 +0100496 * Quoting draft-ietf-tls-dtls-connection-id-05
497 * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
Hanno Becker89dcc882019-04-26 13:56:39 +0100498 *
499 * struct {
500 * opaque cid<0..2^8-1>;
501 * } ConnectionId;
502 */
503
504 if( len < 1 )
505 {
506 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
507 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
508 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
509 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
510 }
511
512 peer_cid_len = *buf++;
513 len--;
514
515 if( len != peer_cid_len )
516 {
517 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
518 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
519 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
520 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
521 }
522
523 /* Ignore CID if the user has disabled its use. */
524 if( ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED )
525 {
526 /* Leave ssl->handshake->cid_in_use in its default
527 * value of MBEDTLS_SSL_CID_DISABLED. */
528 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Client sent CID extension, but CID disabled" ) );
529 return( 0 );
530 }
531
532 if( peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX )
533 {
534 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
535 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
536 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
537 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
538 }
539
Hanno Becker08556bf2019-05-03 12:43:44 +0100540 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Becker89dcc882019-04-26 13:56:39 +0100541 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
542 memcpy( ssl->handshake->peer_cid, buf, peer_cid_len );
543
544 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use of CID extension negotiated" ) );
545 MBEDTLS_SSL_DEBUG_BUF( 3, "Client CID", buf, peer_cid_len );
546
Hanno Becker89dcc882019-04-26 13:56:39 +0100547 return( 0 );
548}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100549#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker89dcc882019-04-26 13:56:39 +0100550
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200551#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
552static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200553 const unsigned char *buf,
554 size_t len )
555{
556 if( len != 0 )
557 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200558 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200559 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
560 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200561 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200562 }
563
564 ((void) buf);
565
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200566 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200567 ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200568
569 return( 0 );
570}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200571#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200572
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200573#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
574static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100575 const unsigned char *buf,
576 size_t len )
577{
578 if( len != 0 )
579 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200580 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200581 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
582 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200583 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100584 }
585
586 ((void) buf);
587
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200588 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200589 ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100590 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200591 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100592 }
593
594 return( 0 );
595}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200596#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100597
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200598#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
599static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200600 const unsigned char *buf,
601 size_t len )
602{
603 if( len != 0 )
604 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200605 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200606 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
607 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200608 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200609 }
610
611 ((void) buf);
612
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200613 if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200614 ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200615 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200616 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200617 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200618
619 return( 0 );
620}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200621#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200622
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200623#if defined(MBEDTLS_SSL_SESSION_TICKETS)
624static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200625 unsigned char *buf,
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200626 size_t len )
627{
Janos Follath865b3eb2019-12-16 11:46:15 +0000628 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200629 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200630
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200631 mbedtls_ssl_session_init( &session );
632
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200633 if( ssl->conf->f_ticket_parse == NULL ||
634 ssl->conf->f_ticket_write == NULL )
635 {
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200636 return( 0 );
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200637 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200638
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200639 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200640 ssl->handshake->new_session_ticket = 1;
641
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200642 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", len ) );
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200643
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200644 if( len == 0 )
645 return( 0 );
646
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200647#if defined(MBEDTLS_SSL_RENEGOTIATION)
648 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200649 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200650 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket rejected: renegotiating" ) );
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200651 return( 0 );
652 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200653#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200654
655 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200656 * Failures are ok: just ignore the ticket and proceed.
657 */
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200658 if( ( ret = ssl->conf->f_ticket_parse( ssl->conf->p_ticket, &session,
659 buf, len ) ) != 0 )
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200660 {
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200661 mbedtls_ssl_session_free( &session );
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200662
663 if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )
664 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is not authentic" ) );
665 else if( ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED )
666 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is expired" ) );
667 else
668 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_parse", ret );
669
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200670 return( 0 );
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200671 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200672
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200673 /*
674 * Keep the session ID sent by the client, since we MUST send it back to
675 * inform them we're accepting the ticket (RFC 5077 section 3.4)
676 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200677 session.id_len = ssl->session_negotiate->id_len;
678 memcpy( &session.id, ssl->session_negotiate->id, session.id_len );
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200679
680 mbedtls_ssl_session_free( ssl->session_negotiate );
681 memcpy( ssl->session_negotiate, &session, sizeof( mbedtls_ssl_session ) );
682
683 /* Zeroize instead of free as we copied the content */
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500684 mbedtls_platform_zeroize( &session, sizeof( mbedtls_ssl_session ) );
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200685
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200686 MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from ticket" ) );
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200687
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200688 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200689
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200690 /* Don't send a new ticket after all, this one is OK */
691 ssl->handshake->new_session_ticket = 0;
692
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200693 return( 0 );
694}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200695#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200696
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200697#if defined(MBEDTLS_SSL_ALPN)
698static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard14beb082014-07-08 13:50:35 +0200699 const unsigned char *buf, size_t len )
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200700{
Paul Bakker14b16c62014-05-28 11:33:54 +0200701 size_t list_len, cur_len, ours_len;
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200702 const unsigned char *theirs, *start, *end;
703 const char **ours;
704
705 /* If ALPN not configured, just ignore the extension */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200706 if( ssl->conf->alpn_list == NULL )
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200707 return( 0 );
708
709 /*
710 * opaque ProtocolName<1..2^8-1>;
711 *
712 * struct {
713 * ProtocolName protocol_name_list<2..2^16-1>
714 * } ProtocolNameList;
715 */
716
717 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
718 if( len < 4 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200719 {
720 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
721 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200722 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200723 }
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200724
725 list_len = ( buf[0] << 8 ) | buf[1];
726 if( list_len != len - 2 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200727 {
728 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
729 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200730 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200731 }
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200732
733 /*
Manuel Pégourié-Gonnard239987f2018-01-09 10:43:43 +0100734 * Validate peer's list (lengths)
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200735 */
736 start = buf + 2;
737 end = buf + len;
Manuel Pégourié-Gonnard239987f2018-01-09 10:43:43 +0100738 for( theirs = start; theirs != end; theirs += cur_len )
739 {
740 cur_len = *theirs++;
741
742 /* Current identifier must fit in list */
743 if( cur_len > (size_t)( end - theirs ) )
744 {
745 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
746 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
747 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
748 }
749
750 /* Empty strings MUST NOT be included */
751 if( cur_len == 0 )
752 {
753 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
754 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
755 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
756 }
757 }
758
759 /*
760 * Use our order of preference
761 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200762 for( ours = ssl->conf->alpn_list; *ours != NULL; ours++ )
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200763 {
Paul Bakker14b16c62014-05-28 11:33:54 +0200764 ours_len = strlen( *ours );
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200765 for( theirs = start; theirs != end; theirs += cur_len )
766 {
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200767 cur_len = *theirs++;
768
Paul Bakker14b16c62014-05-28 11:33:54 +0200769 if( cur_len == ours_len &&
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200770 memcmp( theirs, *ours, cur_len ) == 0 )
771 {
772 ssl->alpn_chosen = *ours;
773 return( 0 );
774 }
775 }
776 }
777
778 /* If we get there, no match was found */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200779 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
780 MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL );
781 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200782}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200783#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200784
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100785/*
786 * Auxiliary functions for ServerHello parsing and related actions
787 */
788
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200789#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100790/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100791 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100792 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200793#if defined(MBEDTLS_ECDSA_C)
794static int ssl_check_key_curve( mbedtls_pk_context *pk,
795 const mbedtls_ecp_curve_info **curves )
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100796{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200797 const mbedtls_ecp_curve_info **crv = curves;
798 mbedtls_ecp_group_id grp_id = mbedtls_pk_ec( *pk )->grp.id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100799
800 while( *crv != NULL )
801 {
802 if( (*crv)->grp_id == grp_id )
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100803 return( 0 );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100804 crv++;
805 }
806
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100807 return( -1 );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100808}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200809#endif /* MBEDTLS_ECDSA_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100810
811/*
812 * Try picking a certificate for this ciphersuite,
813 * return 0 on success and -1 on failure.
814 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200815static int ssl_pick_cert( mbedtls_ssl_context *ssl,
816 const mbedtls_ssl_ciphersuite_t * ciphersuite_info )
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100817{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200818 mbedtls_ssl_key_cert *cur, *list, *fallback = NULL;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100819 mbedtls_pk_type_t pk_alg =
820 mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200821 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100822
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200823#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100824 if( ssl->handshake->sni_key_cert != NULL )
825 list = ssl->handshake->sni_key_cert;
826 else
827#endif
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200828 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100829
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200830 if( pk_alg == MBEDTLS_PK_NONE )
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100831 return( 0 );
832
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200833 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite requires certificate" ) );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000834
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200835 if( list == NULL )
836 {
837 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server has no certificate" ) );
838 return( -1 );
839 }
840
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100841 for( cur = list; cur != NULL; cur = cur->next )
842 {
Andrzej Kurek7ed01e82020-03-18 11:51:59 -0400843 flags = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200844 MBEDTLS_SSL_DEBUG_CRT( 3, "candidate certificate chain, certificate",
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000845 cur->cert );
846
Gilles Peskinee198df52018-01-05 21:17:45 +0100847 if( ! mbedtls_pk_can_do( &cur->cert->pk, pk_alg ) )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000848 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200849 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: key type" ) );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100850 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000851 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100852
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200853 /*
854 * This avoids sending the client a cert it'll reject based on
855 * keyUsage or other extensions.
856 *
857 * It also allows the user to provision different certificates for
858 * different uses based on keyUsage, eg if they want to avoid signing
859 * and decrypting with the same RSA key.
860 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861 if( mbedtls_ssl_check_cert_usage( cur->cert, ciphersuite_info,
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +0100862 MBEDTLS_SSL_IS_SERVER, &flags ) != 0 )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200863 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200864 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: "
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000865 "(extended) key usage extension" ) );
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200866 continue;
867 }
868
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200869#if defined(MBEDTLS_ECDSA_C)
870 if( pk_alg == MBEDTLS_PK_ECDSA &&
Gilles Peskine81d4e892017-10-27 10:18:44 +0200871 ssl_check_key_curve( &cur->cert->pk, ssl->handshake->curves ) != 0 )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000872 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200873 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: elliptic curve" ) );
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100874 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000875 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100876#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100877
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100878 /*
879 * Try to select a SHA-1 certificate for pre-1.2 clients, but still
880 * present them a SHA-higher cert rather than failing if it's the only
881 * one we got that satisfies the other conditions.
882 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200883 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 &&
884 cur->cert->sig_md != MBEDTLS_MD_SHA1 )
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100885 {
886 if( fallback == NULL )
887 fallback = cur;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000888 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200889 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate not preferred: "
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000890 "sha-2 with pre-TLS 1.2 client" ) );
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100891 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000892 }
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100893 }
894
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100895 /* If we get there, we got a winner */
896 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100897 }
898
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000899 if( cur == NULL )
900 cur = fallback;
901
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200902 /* Do not update ssl->handshake->key_cert unless there is a match */
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100903 if( cur != NULL )
904 {
905 ssl->handshake->key_cert = cur;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200906 MBEDTLS_SSL_DEBUG_CRT( 3, "selected certificate chain, certificate",
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000907 ssl->handshake->key_cert->cert );
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100908 return( 0 );
909 }
910
911 return( -1 );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100912}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200913#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100914
915/*
916 * Check if a given ciphersuite is suitable for use with our config/keys/etc
917 * Sets ciphersuite_info only if the suite matches.
918 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200919static int ssl_ciphersuite_match( mbedtls_ssl_context *ssl, int suite_id,
920 const mbedtls_ssl_ciphersuite_t **ciphersuite_info )
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100921{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200922 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100923
Hanno Becker7e5437a2017-04-28 17:15:26 +0100924#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +0100925 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100926 mbedtls_pk_type_t sig_type;
927#endif
928
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200929 suite_info = mbedtls_ssl_ciphersuite_from_id( suite_id );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100930 if( suite_info == NULL )
931 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200932 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
933 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100934 }
935
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200936 MBEDTLS_SSL_DEBUG_MSG( 3, ( "trying ciphersuite: %s", suite_info->name ) );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000937
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100938 if( suite_info->min_minor_ver > ssl->minor_ver ||
939 suite_info->max_minor_ver < ssl->minor_ver )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000940 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200941 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: version" ) );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100942 return( 0 );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000943 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100944
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200945#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200946 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200947 ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )
Manuel Pégourié-Gonnardd6664512014-02-06 13:26:57 +0100948 return( 0 );
949#endif
950
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +0200951#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200952 if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200953 suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000954 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200955 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: rc4" ) );
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +0100956 return( 0 );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000957 }
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +0200958#endif
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +0100959
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200960#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
961 if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200962 ( ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK ) == 0 )
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200963 {
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200964 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: ecjpake "
965 "not configured or ext missing" ) );
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200966 return( 0 );
967 }
968#endif
969
970
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200971#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
972 if( mbedtls_ssl_ciphersuite_uses_ec( suite_info ) &&
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100973 ( ssl->handshake->curves == NULL ||
974 ssl->handshake->curves[0] == NULL ) )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000975 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200976 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: "
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000977 "no common elliptic curve" ) );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100978 return( 0 );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000979 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100980#endif
981
Gilles Peskineeccd8882020-03-10 12:19:08 +0100982#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100983 /* If the ciphersuite requires a pre-shared key and we don't
984 * have one, skip it now rather than failing later */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200985 if( mbedtls_ssl_ciphersuite_uses_psk( suite_info ) &&
Hanno Becker845b9462018-10-26 12:07:29 +0100986 ssl_conf_has_psk_or_cb( ssl->conf ) == 0 )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000987 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200988 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: no pre-shared key" ) );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100989 return( 0 );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000990 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100991#endif
992
Hanno Becker7e5437a2017-04-28 17:15:26 +0100993#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +0100994 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100995 /* If the ciphersuite requires signing, check whether
996 * a suitable hash algorithm is present. */
997 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
998 {
999 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg( suite_info );
1000 if( sig_type != MBEDTLS_PK_NONE &&
1001 mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, sig_type ) == MBEDTLS_MD_NONE )
1002 {
1003 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: no suitable hash algorithm "
1004 "for signature algorithm %d", sig_type ) );
1005 return( 0 );
1006 }
1007 }
1008
1009#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
Gilles Peskineeccd8882020-03-10 12:19:08 +01001010 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001011
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001012#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +01001013 /*
1014 * Final check: if ciphersuite requires us to have a
1015 * certificate/key of a particular type:
1016 * - select the appropriate certificate if we have one, or
1017 * - try the next ciphersuite if we don't
1018 * This must be done last since we modify the key_cert list.
1019 */
1020 if( ssl_pick_cert( ssl, suite_info ) != 0 )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001021 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: "
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001023 "no suitable certificate" ) );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +01001024 return( 0 );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001025 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +01001026#endif
1027
1028 *ciphersuite_info = suite_info;
1029 return( 0 );
1030}
1031
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001032#if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
1033static int ssl_parse_client_hello_v2( mbedtls_ssl_context *ssl )
Paul Bakker78a8c712013-03-06 17:01:52 +01001034{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001035 int ret, got_common_suite;
Paul Bakker78a8c712013-03-06 17:01:52 +01001036 unsigned int i, j;
1037 size_t n;
1038 unsigned int ciph_len, sess_len, chal_len;
1039 unsigned char *buf, *p;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001040 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker78a8c712013-03-06 17:01:52 +01001042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001043 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) );
Paul Bakker78a8c712013-03-06 17:01:52 +01001044
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001045#if defined(MBEDTLS_SSL_RENEGOTIATION)
1046 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Paul Bakker78a8c712013-03-06 17:01:52 +01001047 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001048 MBEDTLS_SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001049 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1050 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001051 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001052 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001053#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker78a8c712013-03-06 17:01:52 +01001054
1055 buf = ssl->in_hdr;
1056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001057 MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, 5 );
Paul Bakker78a8c712013-03-06 17:01:52 +01001058
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001059 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d",
Paul Bakker78a8c712013-03-06 17:01:52 +01001060 buf[2] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001061 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d",
Paul Bakker78a8c712013-03-06 17:01:52 +01001062 ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001063 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]",
Paul Bakker78a8c712013-03-06 17:01:52 +01001064 buf[3], buf[4] ) );
1065
1066 /*
1067 * SSLv2 Client Hello
1068 *
1069 * Record layer:
1070 * 0 . 1 message length
1071 *
1072 * SSL layer:
1073 * 2 . 2 message type
1074 * 3 . 4 protocol version
1075 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001076 if( buf[2] != MBEDTLS_SSL_HS_CLIENT_HELLO ||
1077 buf[3] != MBEDTLS_SSL_MAJOR_VERSION_3 )
Paul Bakker78a8c712013-03-06 17:01:52 +01001078 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001079 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1080 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001081 }
1082
1083 n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF;
1084
1085 if( n < 17 || n > 512 )
1086 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001087 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1088 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001089 }
1090
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001091 ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001092 ssl->minor_ver = ( buf[4] <= ssl->conf->max_minor_ver )
1093 ? buf[4] : ssl->conf->max_minor_ver;
Paul Bakker78a8c712013-03-06 17:01:52 +01001094
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001095 if( ssl->minor_ver < ssl->conf->min_minor_ver )
Paul Bakker78a8c712013-03-06 17:01:52 +01001096 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001097 MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001098 " [%d:%d] < [%d:%d]",
1099 ssl->major_ver, ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001100 ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) );
Paul Bakker78a8c712013-03-06 17:01:52 +01001101
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001102 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1103 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
1104 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
Paul Bakker78a8c712013-03-06 17:01:52 +01001105 }
1106
Paul Bakker2fbefde2013-06-29 16:01:15 +02001107 ssl->handshake->max_major_ver = buf[3];
1108 ssl->handshake->max_minor_ver = buf[4];
Paul Bakker78a8c712013-03-06 17:01:52 +01001109
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001110 if( ( ret = mbedtls_ssl_fetch_input( ssl, 2 + n ) ) != 0 )
Paul Bakker78a8c712013-03-06 17:01:52 +01001111 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001112 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
Paul Bakker78a8c712013-03-06 17:01:52 +01001113 return( ret );
1114 }
1115
1116 ssl->handshake->update_checksum( ssl, buf + 2, n );
1117
1118 buf = ssl->in_msg;
1119 n = ssl->in_left - 5;
1120
1121 /*
1122 * 0 . 1 ciphersuitelist length
1123 * 2 . 3 session id length
1124 * 4 . 5 challenge length
1125 * 6 . .. ciphersuitelist
1126 * .. . .. session id
1127 * .. . .. challenge
1128 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001129 MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, n );
Paul Bakker78a8c712013-03-06 17:01:52 +01001130
1131 ciph_len = ( buf[0] << 8 ) | buf[1];
1132 sess_len = ( buf[2] << 8 ) | buf[3];
1133 chal_len = ( buf[4] << 8 ) | buf[5];
1134
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001135 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d",
Paul Bakker78a8c712013-03-06 17:01:52 +01001136 ciph_len, sess_len, chal_len ) );
1137
1138 /*
1139 * Make sure each parameter length is valid
1140 */
1141 if( ciph_len < 3 || ( ciph_len % 3 ) != 0 )
1142 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001143 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1144 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001145 }
1146
1147 if( sess_len > 32 )
1148 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001149 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1150 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001151 }
1152
1153 if( chal_len < 8 || chal_len > 32 )
1154 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001155 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1156 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001157 }
1158
1159 if( n != 6 + ciph_len + sess_len + chal_len )
1160 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001161 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1162 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001163 }
1164
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001165 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
Paul Bakker78a8c712013-03-06 17:01:52 +01001166 buf + 6, ciph_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001167 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id",
Paul Bakker78a8c712013-03-06 17:01:52 +01001168 buf + 6 + ciph_len, sess_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001169 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, challenge",
Paul Bakker78a8c712013-03-06 17:01:52 +01001170 buf + 6 + ciph_len + sess_len, chal_len );
1171
1172 p = buf + 6 + ciph_len;
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001173 ssl->session_negotiate->id_len = sess_len;
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001174 memset( ssl->session_negotiate->id, 0,
1175 sizeof( ssl->session_negotiate->id ) );
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001176 memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->id_len );
Paul Bakker78a8c712013-03-06 17:01:52 +01001177
1178 p += sess_len;
1179 memset( ssl->handshake->randbytes, 0, 64 );
1180 memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len );
1181
1182 /*
1183 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1184 */
1185 for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )
1186 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001187 if( p[0] == 0 && p[1] == 0 && p[2] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO )
Paul Bakker78a8c712013-03-06 17:01:52 +01001188 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001189 MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
1190#if defined(MBEDTLS_SSL_RENEGOTIATION)
1191 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Paul Bakker78a8c712013-03-06 17:01:52 +01001192 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001193 MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV "
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001194 "during renegotiation" ) );
Paul Bakker78a8c712013-03-06 17:01:52 +01001195
Gilles Peskinec94f7352017-05-10 16:37:56 +02001196 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1197 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001198 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001199 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001200#endif /* MBEDTLS_SSL_RENEGOTIATION */
1201 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker78a8c712013-03-06 17:01:52 +01001202 break;
1203 }
1204 }
1205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001206#if defined(MBEDTLS_SSL_FALLBACK_SCSV)
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001207 for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )
1208 {
1209 if( p[0] == 0 &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001210 p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) &&
1211 p[2] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) )
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001212 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001213 MBEDTLS_SSL_DEBUG_MSG( 3, ( "received FALLBACK_SCSV" ) );
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001214
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001215 if( ssl->minor_ver < ssl->conf->max_minor_ver )
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001216 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001217 MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) );
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001218
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001219 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1220 MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK );
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001221
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001222 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001223 }
1224
1225 break;
1226 }
1227 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001228#endif /* MBEDTLS_SSL_FALLBACK_SCSV */
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001229
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001230 got_common_suite = 0;
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001231 ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001232 ciphersuite_info = NULL;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001233#if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE)
Manuel Pégourié-Gonnard1a9f2c72013-11-30 18:30:06 +01001234 for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
Manuel Pégourié-Gonnard1a9f2c72013-11-30 18:30:06 +01001235 for( i = 0; ciphersuites[i] != 0; i++ )
1236#else
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001237 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker78a8c712013-03-06 17:01:52 +01001238 for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
Manuel Pégourié-Gonnard1a9f2c72013-11-30 18:30:06 +01001239#endif
Paul Bakker78a8c712013-03-06 17:01:52 +01001240 {
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001241 if( p[0] != 0 ||
1242 p[1] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) ||
1243 p[2] != ( ( ciphersuites[i] ) & 0xFF ) )
1244 continue;
Paul Bakker59c28a22013-06-29 15:33:42 +02001245
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001246 got_common_suite = 1;
1247
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001248 if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i],
1249 &ciphersuite_info ) ) != 0 )
1250 return( ret );
Paul Bakker59c28a22013-06-29 15:33:42 +02001251
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001252 if( ciphersuite_info != NULL )
Paul Bakker78a8c712013-03-06 17:01:52 +01001253 goto have_ciphersuite_v2;
1254 }
Paul Bakker78a8c712013-03-06 17:01:52 +01001255
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001256 if( got_common_suite )
1257 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001258 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, "
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001259 "but none of them usable" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001260 return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE );
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001261 }
1262 else
1263 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001264 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
1265 return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001266 }
Paul Bakker78a8c712013-03-06 17:01:52 +01001267
1268have_ciphersuite_v2:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001269 MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001270
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001271 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00001272 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker78a8c712013-03-06 17:01:52 +01001273
1274 /*
1275 * SSLv2 Client Hello relevant renegotiation security checks
1276 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001277 if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001278 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker78a8c712013-03-06 17:01:52 +01001279 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001280 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001281 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1282 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001283 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001284 }
1285
1286 ssl->in_left = 0;
1287 ssl->state++;
1288
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001289 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) );
Paul Bakker78a8c712013-03-06 17:01:52 +01001290
1291 return( 0 );
1292}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001293#endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
Paul Bakker78a8c712013-03-06 17:01:52 +01001294
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001295/* This function doesn't alert on errors that happen early during
1296 ClientHello parsing because they might indicate that the client is
1297 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001298static int ssl_parse_client_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001299{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001300 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +02001301 size_t i, j;
1302 size_t ciph_offset, comp_offset, ext_offset;
1303 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001304#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +02001305 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001306#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001307 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001308#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001309 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001310#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001311 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001312 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001313 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01001314 int major, minor;
Paul Bakker5121ce52009-01-03 21:22:43 +00001315
Hanno Becker7e5437a2017-04-28 17:15:26 +01001316 /* If there is no signature-algorithm extension present,
1317 * we need to fall back to the default values for allowed
1318 * signature-hash pairs. */
1319#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001320 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001321 int sig_hash_alg_ext_present = 0;
1322#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
Gilles Peskineeccd8882020-03-10 12:19:08 +01001323 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01001324
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001325 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001327#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001328read_record_header:
1329#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001330 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001331 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001332 * otherwise read it ourselves manually in order to support SSLv2
1333 * ClientHello, which doesn't use the same record layer format.
1334 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001335#if defined(MBEDTLS_SSL_RENEGOTIATION)
1336 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001337#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001338 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001339 if( ( ret = mbedtls_ssl_fetch_input( ssl, 5 ) ) != 0 )
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +00001340 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001341 /* No alert on a read error. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001342 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +00001343 return( ret );
1344 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001345 }
1346
1347 buf = ssl->in_hdr;
1348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001349#if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
1350#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001351 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_STREAM )
Manuel Pégourié-Gonnard8a7cf252014-10-09 17:35:53 +02001352#endif
1353 if( ( buf[0] & 0x80 ) != 0 )
Gilles Peskinef9828522017-05-03 12:28:43 +02001354 return( ssl_parse_client_hello_v2( ssl ) );
Paul Bakker78a8c712013-03-06 17:01:52 +01001355#endif
1356
Hanno Becker5903de42019-05-03 14:46:38 +01001357 MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, mbedtls_ssl_in_hdr_len( ssl ) );
Paul Bakkerec636f32012-09-09 19:17:02 +00001358
Paul Bakkerec636f32012-09-09 19:17:02 +00001359 /*
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001360 * SSLv3/TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +00001361 *
1362 * Record layer:
1363 * 0 . 0 message type
1364 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001365 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +00001366 * 3 . 4 message length
1367 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001368 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d",
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001369 buf[0] ) );
1370
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001371 if( buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE )
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01001372 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001373 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1374 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01001375 }
1376
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001377 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d",
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001378 ( ssl->in_len[0] << 8 ) | ssl->in_len[1] ) );
1379
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001380 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, protocol version: [%d:%d]",
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001381 buf[1], buf[2] ) );
1382
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001383 mbedtls_ssl_read_version( &major, &minor, ssl->conf->transport, buf + 1 );
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001384
1385 /* According to RFC 5246 Appendix E.1, the version here is typically
1386 * "{03,00}, the lowest version number supported by the client, [or] the
1387 * value of ClientHello.client_version", so the only meaningful check here
1388 * is the major version shouldn't be less than 3 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001389 if( major < MBEDTLS_SSL_MAJOR_VERSION_3 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001390 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001391 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1392 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakkerec636f32012-09-09 19:17:02 +00001393 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001394
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001395 /* For DTLS if this is the initial handshake, remember the client sequence
1396 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001397#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001398 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001399#if defined(MBEDTLS_SSL_RENEGOTIATION)
1400 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +00001401#endif
1402 )
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001403 {
1404 /* Epoch should be 0 for initial handshakes */
1405 if( ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0 )
1406 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001407 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1408 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001409 }
1410
Hanno Becker19859472018-08-06 09:40:20 +01001411 memcpy( ssl->cur_out_ctr + 2, ssl->in_ctr + 2, 6 );
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001413#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
1414 if( mbedtls_ssl_dtls_replay_check( ssl ) != 0 )
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001415 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001416 MBEDTLS_SSL_DEBUG_MSG( 1, ( "replayed record, discarding" ) );
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001417 ssl->next_record_offset = 0;
1418 ssl->in_left = 0;
1419 goto read_record_header;
1420 }
1421
1422 /* No MAC to check yet, so we can update right now */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001423 mbedtls_ssl_dtls_replay_update( ssl );
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001424#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001425 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001426#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001427
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001428 msg_len = ( ssl->in_len[0] << 8 ) | ssl->in_len[1];
Paul Bakker5121ce52009-01-03 21:22:43 +00001429
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001430#if defined(MBEDTLS_SSL_RENEGOTIATION)
1431 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001432 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001433 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001434 msg_len = ssl->in_hslen;
1435 }
1436 else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001437#endif
Paul Bakkerec636f32012-09-09 19:17:02 +00001438 {
Angus Grattond8213d02016-05-25 20:56:48 +10001439 if( msg_len > MBEDTLS_SSL_IN_CONTENT_LEN )
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001440 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001441 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1442 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001443 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001444
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01001445 if( ( ret = mbedtls_ssl_fetch_input( ssl,
Hanno Becker5903de42019-05-03 14:46:38 +01001446 mbedtls_ssl_in_hdr_len( ssl ) + msg_len ) ) != 0 )
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001447 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001448 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001449 return( ret );
1450 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001451
1452 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001453#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001454 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Hanno Becker5903de42019-05-03 14:46:38 +01001455 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len( ssl );
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001456 else
1457#endif
1458 ssl->in_left = 0;
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001459 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001460
1461 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +00001462
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001463 MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, msg_len );
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001464
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001465 ssl->handshake->update_checksum( ssl, buf, msg_len );
Paul Bakkerec636f32012-09-09 19:17:02 +00001466
1467 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001468 * Handshake layer:
1469 * 0 . 0 handshake type
1470 * 1 . 3 handshake length
1471 * 4 . 5 DTLS only: message seqence number
1472 * 6 . 8 DTLS only: fragment offset
1473 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001474 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001475 if( msg_len < mbedtls_ssl_hs_hdr_len( ssl ) )
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001476 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001477 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1478 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001479 }
1480
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001481 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d", buf[0] ) );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001482
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001483 if( buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO )
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001484 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001485 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1486 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001487 }
1488
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001489 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d",
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001490 ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) );
1491
1492 /* We don't support fragmentation of ClientHello (yet?) */
1493 if( buf[1] != 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001494 msg_len != mbedtls_ssl_hs_hdr_len( ssl ) + ( ( buf[2] << 8 ) | buf[3] ) )
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001495 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001496 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1497 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001498 }
1499
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001500#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001501 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001502 {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001503 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001504 * Copy the client's handshake message_seq on initial handshakes,
1505 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001506 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001507#if defined(MBEDTLS_SSL_RENEGOTIATION)
1508 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001509 {
1510 /* This couldn't be done in ssl_prepare_handshake_record() */
1511 unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) |
1512 ssl->in_msg[5];
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001513
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001514 if( cli_msg_seq != ssl->handshake->in_msg_seq )
1515 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001516 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message_seq: "
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001517 "%d (expected %d)", cli_msg_seq,
1518 ssl->handshake->in_msg_seq ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001519 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001520 }
1521
1522 ssl->handshake->in_msg_seq++;
1523 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001524 else
1525#endif
1526 {
1527 unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) |
1528 ssl->in_msg[5];
1529 ssl->handshake->out_msg_seq = cli_msg_seq;
1530 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1531 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001532
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001533 /*
1534 * For now we don't support fragmentation, so make sure
1535 * fragment_offset == 0 and fragment_length == length
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001536 */
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001537 if( ssl->in_msg[6] != 0 || ssl->in_msg[7] != 0 || ssl->in_msg[8] != 0 ||
1538 memcmp( ssl->in_msg + 1, ssl->in_msg + 9, 3 ) != 0 )
1539 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001540 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ClientHello fragmentation not supported" ) );
1541 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001542 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001543 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001544#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001545
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001546 buf += mbedtls_ssl_hs_hdr_len( ssl );
1547 msg_len -= mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001548
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001549 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001550 * ClientHello layer:
1551 * 0 . 1 protocol version
1552 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
1553 * 34 . 35 session id length (1 byte)
1554 * 35 . 34+x session id
1555 * 35+x . 35+x DTLS only: cookie length (1 byte)
1556 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001557 * .. . .. ciphersuite list length (2 bytes)
1558 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001559 * .. . .. compression alg. list length (1 byte)
1560 * .. . .. compression alg. list
1561 * .. . .. extensions length (2 bytes, optional)
1562 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001563 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001564
1565 /*
Antonin Décimo36e89b52019-01-23 15:24:37 +01001566 * Minimal length (with everything empty and extensions omitted) is
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001567 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1568 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001569 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001570 if( msg_len < 38 )
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001571 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001572 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1573 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001574 }
1575
1576 /*
1577 * Check and save the protocol version
1578 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001579 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, version", buf, 2 );
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001580
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001581 mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001582 ssl->conf->transport, buf );
Paul Bakkerec636f32012-09-09 19:17:02 +00001583
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001584 ssl->handshake->max_major_ver = ssl->major_ver;
1585 ssl->handshake->max_minor_ver = ssl->minor_ver;
1586
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001587 if( ssl->major_ver < ssl->conf->min_major_ver ||
1588 ssl->minor_ver < ssl->conf->min_minor_ver )
Paul Bakker1d29fb52012-09-28 13:28:45 +00001589 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001590 MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001591 " [%d:%d] < [%d:%d]",
1592 ssl->major_ver, ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001593 ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001594 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1595 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001596 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
Paul Bakker1d29fb52012-09-28 13:28:45 +00001597 }
1598
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001599 if( ssl->major_ver > ssl->conf->max_major_ver )
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001600 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001601 ssl->major_ver = ssl->conf->max_major_ver;
1602 ssl->minor_ver = ssl->conf->max_minor_ver;
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001603 }
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001604 else if( ssl->minor_ver > ssl->conf->max_minor_ver )
1605 ssl->minor_ver = ssl->conf->max_minor_ver;
Paul Bakkerec636f32012-09-09 19:17:02 +00001606
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001607 /*
1608 * Save client random (inc. Unix time)
1609 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001610 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 2, 32 );
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001611
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001612 memcpy( ssl->handshake->randbytes, buf + 2, 32 );
Paul Bakkerec636f32012-09-09 19:17:02 +00001613
1614 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001615 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001616 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001617 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001618
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001619 if( sess_len > sizeof( ssl->session_negotiate->id ) ||
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001620 sess_len + 34 + 2 > msg_len ) /* 2 for cipherlist length field */
Paul Bakkerec636f32012-09-09 19:17:02 +00001621 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001622 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001623 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1624 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001625 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakkerec636f32012-09-09 19:17:02 +00001626 }
1627
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001628 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 35, sess_len );
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001629
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001630 ssl->session_negotiate->id_len = sess_len;
Paul Bakker48916f92012-09-16 19:57:18 +00001631 memset( ssl->session_negotiate->id, 0,
1632 sizeof( ssl->session_negotiate->id ) );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001633 memcpy( ssl->session_negotiate->id, buf + 35,
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001634 ssl->session_negotiate->id_len );
Paul Bakkerec636f32012-09-09 19:17:02 +00001635
1636 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001637 * Check the cookie length and content
1638 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001639#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001640 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001641 {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001642 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001643 cookie_len = buf[cookie_offset];
1644
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001645 if( cookie_offset + 1 + cookie_len + 2 > msg_len )
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001646 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001647 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001648 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1649 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001650 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001651 }
1652
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001653 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001654 buf + cookie_offset + 1, cookie_len );
1655
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001656#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001657 if( ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001658#if defined(MBEDTLS_SSL_RENEGOTIATION)
1659 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001660#endif
1661 )
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001662 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001663 if( ssl->conf->f_cookie_check( ssl->conf->p_cookie,
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001664 buf + cookie_offset + 1, cookie_len,
1665 ssl->cli_id, ssl->cli_id_len ) != 0 )
1666 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001667 MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification failed" ) );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001668 ssl->handshake->verify_cookie_len = 1;
1669 }
1670 else
1671 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001672 MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification passed" ) );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001673 ssl->handshake->verify_cookie_len = 0;
1674 }
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001675 }
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02001676 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001677#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001678 {
1679 /* We know we didn't send a cookie, so it should be empty */
1680 if( cookie_len != 0 )
1681 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001682 /* This may be an attacker's probe, so don't send an alert */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001683 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1684 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001685 }
1686
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001687 MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification skipped" ) );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001688 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001689
1690 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001691 * Check the ciphersuitelist length (will be parsed later)
Paul Bakkerec636f32012-09-09 19:17:02 +00001692 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001693 ciph_offset = cookie_offset + 1 + cookie_len;
Manuel Pégourié-Gonnarda06d7fe2015-03-13 10:36:55 +00001694 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001695 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001696#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001697 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001698
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001699 ciph_len = ( buf[ciph_offset + 0] << 8 )
1700 | ( buf[ciph_offset + 1] );
1701
1702 if( ciph_len < 2 ||
1703 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
1704 ( ciph_len % 2 ) != 0 )
Paul Bakkerec636f32012-09-09 19:17:02 +00001705 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001706 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001707 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1708 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001709 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakkerec636f32012-09-09 19:17:02 +00001710 }
1711
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001712 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001713 buf + ciph_offset + 2, ciph_len );
Paul Bakkerec636f32012-09-09 19:17:02 +00001714
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001715 /*
1716 * Check the compression algorithms length and pick one
1717 */
1718 comp_offset = ciph_offset + 2 + ciph_len;
1719
1720 comp_len = buf[comp_offset];
1721
1722 if( comp_len < 1 ||
1723 comp_len > 16 ||
1724 comp_len + comp_offset + 1 > msg_len )
Paul Bakkerec636f32012-09-09 19:17:02 +00001725 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001726 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001727 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1728 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001729 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakkerec636f32012-09-09 19:17:02 +00001730 }
1731
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001732 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, compression",
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001733 buf + comp_offset + 1, comp_len );
Paul Bakker48916f92012-09-16 19:57:18 +00001734
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001735 ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL;
1736#if defined(MBEDTLS_ZLIB_SUPPORT)
Paul Bakkerec636f32012-09-09 19:17:02 +00001737 for( i = 0; i < comp_len; ++i )
1738 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001739 if( buf[comp_offset + 1 + i] == MBEDTLS_SSL_COMPRESS_DEFLATE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001740 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001741 ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_DEFLATE;
Paul Bakkerec636f32012-09-09 19:17:02 +00001742 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001743 }
1744 }
Paul Bakker2770fbd2012-07-03 13:30:23 +00001745#endif
1746
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001747 /* See comments in ssl_write_client_hello() */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001748#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001749 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001750 ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001751#endif
Manuel Pégourié-Gonnard82202f02014-07-23 00:28:58 +02001752
Janos Follathc6dab2b2016-05-23 14:27:02 +01001753 /* Do not parse the extensions if the protocol is SSLv3 */
1754#if defined(MBEDTLS_SSL_PROTO_SSL3)
1755 if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) )
1756 {
1757#endif
Simon Butcher584a5472016-05-23 16:24:52 +01001758 /*
1759 * Check the extension length
1760 */
1761 ext_offset = comp_offset + 1 + comp_len;
1762 if( msg_len > ext_offset )
Paul Bakker48916f92012-09-16 19:57:18 +00001763 {
Simon Butcher584a5472016-05-23 16:24:52 +01001764 if( msg_len < ext_offset + 2 )
1765 {
1766 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001767 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1768 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Simon Butcher584a5472016-05-23 16:24:52 +01001769 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
1770 }
1771
1772 ext_len = ( buf[ext_offset + 0] << 8 )
1773 | ( buf[ext_offset + 1] );
1774
1775 if( ( ext_len > 0 && ext_len < 4 ) ||
1776 msg_len != ext_offset + 2 + ext_len )
1777 {
1778 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001779 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1780 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Simon Butcher584a5472016-05-23 16:24:52 +01001781 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
1782 }
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001783 }
Simon Butcher584a5472016-05-23 16:24:52 +01001784 else
1785 ext_len = 0;
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001786
Simon Butcher584a5472016-05-23 16:24:52 +01001787 ext = buf + ext_offset + 2;
1788 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello extensions", ext, ext_len );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001789
Simon Butcher584a5472016-05-23 16:24:52 +01001790 while( ext_len != 0 )
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001791 {
Philippe Antoine747fd532018-05-30 09:13:21 +02001792 unsigned int ext_id;
1793 unsigned int ext_size;
1794 if ( ext_len < 4 ) {
1795 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1796 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1797 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1798 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
1799 }
1800 ext_id = ( ( ext[0] << 8 ) | ( ext[1] ) );
1801 ext_size = ( ( ext[2] << 8 ) | ( ext[3] ) );
Paul Bakker48916f92012-09-16 19:57:18 +00001802
Simon Butcher584a5472016-05-23 16:24:52 +01001803 if( ext_size + 4 > ext_len )
1804 {
1805 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001806 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1807 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Simon Butcher584a5472016-05-23 16:24:52 +01001808 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
1809 }
1810 switch( ext_id )
1811 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001812#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001813 case MBEDTLS_TLS_EXT_SERVERNAME:
1814 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
1815 if( ssl->conf->f_sni == NULL )
1816 break;
Paul Bakker5701cdc2012-09-27 21:49:42 +00001817
Simon Butcher584a5472016-05-23 16:24:52 +01001818 ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size );
1819 if( ret != 0 )
1820 return( ret );
1821 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001822#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001823
Simon Butcher584a5472016-05-23 16:24:52 +01001824 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
1825 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001826#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001827 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001828#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001829
Simon Butcher584a5472016-05-23 16:24:52 +01001830 ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size );
1831 if( ret != 0 )
1832 return( ret );
1833 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001834
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001835#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001836 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001837 case MBEDTLS_TLS_EXT_SIG_ALG:
Ron Eldor73a38172017-10-03 15:58:26 +03001838 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
1839
Simon Butcher584a5472016-05-23 16:24:52 +01001840 ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size );
1841 if( ret != 0 )
1842 return( ret );
Hanno Becker7e5437a2017-04-28 17:15:26 +01001843
1844 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001845 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001846#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
Gilles Peskineeccd8882020-03-10 12:19:08 +01001847 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001848
Robert Cragie136884c2015-10-02 13:34:31 +01001849#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01001850 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001851 case MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
1852 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001853
Simon Butcher584a5472016-05-23 16:24:52 +01001854 ret = ssl_parse_supported_elliptic_curves( ssl, ext + 4, ext_size );
1855 if( ret != 0 )
1856 return( ret );
1857 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001858
Simon Butcher584a5472016-05-23 16:24:52 +01001859 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
1860 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported point formats extension" ) );
1861 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001862
Simon Butcher584a5472016-05-23 16:24:52 +01001863 ret = ssl_parse_supported_point_formats( ssl, ext + 4, ext_size );
1864 if( ret != 0 )
1865 return( ret );
1866 break;
Robert Cragieae8535d2015-10-06 17:11:18 +01001867#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
1868 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001869
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001870#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001871 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
1872 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake kkpp extension" ) );
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001873
Simon Butcher584a5472016-05-23 16:24:52 +01001874 ret = ssl_parse_ecjpake_kkpp( ssl, ext + 4, ext_size );
1875 if( ret != 0 )
1876 return( ret );
1877 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001878#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1879
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001880#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001881 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
1882 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max fragment length extension" ) );
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001883
Simon Butcher584a5472016-05-23 16:24:52 +01001884 ret = ssl_parse_max_fragment_length_ext( ssl, ext + 4, ext_size );
1885 if( ret != 0 )
1886 return( ret );
1887 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001888#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001889
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001890#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001891 case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
1892 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001893
Simon Butcher584a5472016-05-23 16:24:52 +01001894 ret = ssl_parse_truncated_hmac_ext( ssl, ext + 4, ext_size );
1895 if( ret != 0 )
1896 return( ret );
1897 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001898#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001899
Hanno Beckera0e20d02019-05-15 14:03:01 +01001900#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker89dcc882019-04-26 13:56:39 +01001901 case MBEDTLS_TLS_EXT_CID:
1902 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found CID extension" ) );
1903
1904 ret = ssl_parse_cid_ext( ssl, ext + 4, ext_size );
1905 if( ret != 0 )
1906 return( ret );
1907 break;
1908#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
1909
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001910#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001911 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
1912 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt then mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001913
Simon Butcher584a5472016-05-23 16:24:52 +01001914 ret = ssl_parse_encrypt_then_mac_ext( ssl, ext + 4, ext_size );
1915 if( ret != 0 )
1916 return( ret );
1917 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001918#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001919
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001920#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001921 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
1922 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended master secret extension" ) );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001923
Simon Butcher584a5472016-05-23 16:24:52 +01001924 ret = ssl_parse_extended_ms_ext( ssl, ext + 4, ext_size );
1925 if( ret != 0 )
1926 return( ret );
1927 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001928#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001929
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001930#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001931 case MBEDTLS_TLS_EXT_SESSION_TICKET:
1932 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session ticket extension" ) );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001933
Simon Butcher584a5472016-05-23 16:24:52 +01001934 ret = ssl_parse_session_ticket_ext( ssl, ext + 4, ext_size );
1935 if( ret != 0 )
1936 return( ret );
1937 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001938#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001939
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001940#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001941 case MBEDTLS_TLS_EXT_ALPN:
1942 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001943
Simon Butcher584a5472016-05-23 16:24:52 +01001944 ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size );
1945 if( ret != 0 )
1946 return( ret );
1947 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001948#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001949
Simon Butcher584a5472016-05-23 16:24:52 +01001950 default:
1951 MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
1952 ext_id ) );
1953 }
1954
1955 ext_len -= 4 + ext_size;
1956 ext += 4 + ext_size;
1957
1958 if( ext_len > 0 && ext_len < 4 )
1959 {
1960 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001961 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1962 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Simon Butcher584a5472016-05-23 16:24:52 +01001963 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
1964 }
Paul Bakker48916f92012-09-16 19:57:18 +00001965 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001966#if defined(MBEDTLS_SSL_PROTO_SSL3)
1967 }
1968#endif
1969
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001970#if defined(MBEDTLS_SSL_FALLBACK_SCSV)
Gilles Peskined50177f2017-05-16 17:53:03 +02001971 for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 )
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001972 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001973 if( p[0] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) &&
1974 p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) )
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001975 {
Manuel Pégourié-Gonnardcb0d2122015-07-22 11:52:11 +02001976 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received FALLBACK_SCSV" ) );
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001977
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001978 if( ssl->minor_ver < ssl->conf->max_minor_ver )
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001979 {
Manuel Pégourié-Gonnardcb0d2122015-07-22 11:52:11 +02001980 MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) );
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001981
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001982 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1983 MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK );
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001984
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001985 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001986 }
1987
1988 break;
1989 }
1990 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001991#endif /* MBEDTLS_SSL_FALLBACK_SCSV */
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001992
Hanno Becker7e5437a2017-04-28 17:15:26 +01001993#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001994 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001995
1996 /*
1997 * Try to fall back to default hash SHA1 if the client
1998 * hasn't provided any preferred signature-hash combinations.
1999 */
2000 if( sig_hash_alg_ext_present == 0 )
2001 {
2002 mbedtls_md_type_t md_default = MBEDTLS_MD_SHA1;
2003
2004 if( mbedtls_ssl_check_sig_hash( ssl, md_default ) != 0 )
2005 md_default = MBEDTLS_MD_NONE;
2006
2007 mbedtls_ssl_sig_hash_set_const_hash( &ssl->handshake->hash_algs, md_default );
2008 }
2009
2010#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
Gilles Peskineeccd8882020-03-10 12:19:08 +01002011 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01002012
Paul Bakker48916f92012-09-16 19:57:18 +00002013 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01002014 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
2015 */
2016 for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 )
2017 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002018 if( p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO )
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01002019 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002020 MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
2021#if defined(MBEDTLS_SSL_RENEGOTIATION)
2022 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01002023 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002024 MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV "
2025 "during renegotiation" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02002026 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2027 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002028 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01002029 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00002030#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002031 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01002032 break;
2033 }
2034 }
2035
2036 /*
Paul Bakker48916f92012-09-16 19:57:18 +00002037 * Renegotiation security checks
2038 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002039 if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002040 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002041 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002042 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002043 handshake_failure = 1;
2044 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002045#if defined(MBEDTLS_SSL_RENEGOTIATION)
2046 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2047 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002048 renegotiation_info_seen == 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00002049 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002050 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002051 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +00002052 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002053 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2054 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002055 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00002056 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002057 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002058 handshake_failure = 1;
2059 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002060 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2061 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002062 renegotiation_info_seen == 1 )
2063 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002064 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002065 handshake_failure = 1;
2066 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002067#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002068
2069 if( handshake_failure == 1 )
2070 {
Gilles Peskinec94f7352017-05-10 16:37:56 +02002071 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2072 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002073 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00002074 }
Paul Bakker380da532012-04-18 16:10:25 +00002075
Paul Bakker41c83d32013-03-20 14:39:14 +01002076 /*
2077 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02002078 * (At the end because we need information from the EC-based extensions
2079 * and certificate from the SNI callback triggered by the SNI extension.)
Paul Bakker41c83d32013-03-20 14:39:14 +01002080 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01002081 got_common_suite = 0;
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002082 ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01002083 ciphersuite_info = NULL;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002084#if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE)
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01002085 for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 )
Manuel Pégourié-Gonnard1a9f2c72013-11-30 18:30:06 +01002086 for( i = 0; ciphersuites[i] != 0; i++ )
2087#else
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002088 for( i = 0; ciphersuites[i] != 0; i++ )
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01002089 for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 )
Manuel Pégourié-Gonnard1a9f2c72013-11-30 18:30:06 +01002090#endif
Paul Bakker41c83d32013-03-20 14:39:14 +01002091 {
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01002092 if( p[0] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) ||
2093 p[1] != ( ( ciphersuites[i] ) & 0xFF ) )
2094 continue;
Paul Bakker41c83d32013-03-20 14:39:14 +01002095
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01002096 got_common_suite = 1;
2097
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01002098 if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i],
2099 &ciphersuite_info ) ) != 0 )
2100 return( ret );
2101
2102 if( ciphersuite_info != NULL )
2103 goto have_ciphersuite;
Paul Bakker41c83d32013-03-20 14:39:14 +01002104 }
Paul Bakker41c83d32013-03-20 14:39:14 +01002105
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01002106 if( got_common_suite )
2107 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002108 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, "
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01002109 "but none of them usable" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02002110 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2111 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002112 return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE );
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01002113 }
2114 else
2115 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002116 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02002117 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2118 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002119 return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01002120 }
Paul Bakker41c83d32013-03-20 14:39:14 +01002121
2122have_ciphersuite:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002123 MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00002124
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002125 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Hanno Beckere694c3e2017-12-27 21:34:08 +00002126 ssl->handshake->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01002127
Paul Bakker5121ce52009-01-03 21:22:43 +00002128 ssl->state++;
2129
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002130#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002131 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002132 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02002133#endif
2134
Hanno Becker7e5437a2017-04-28 17:15:26 +01002135 /* Debugging-only output for testsuite */
2136#if defined(MBEDTLS_DEBUG_C) && \
2137 defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01002138 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01002139 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
2140 {
2141 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg( ciphersuite_info );
2142 if( sig_alg != MBEDTLS_PK_NONE )
2143 {
2144 mbedtls_md_type_t md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs,
2145 sig_alg );
2146 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d",
2147 mbedtls_ssl_hash_from_md_alg( md_alg ) ) );
2148 }
2149 else
2150 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002151 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no hash algorithm for signature algorithm "
2152 "%d - should not happen", sig_alg ) );
Hanno Becker7e5437a2017-04-28 17:15:26 +01002153 }
2154 }
2155#endif
2156
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002157 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002158
2159 return( 0 );
2160}
2161
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002162#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
2163static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002164 unsigned char *buf,
2165 size_t *olen )
2166{
2167 unsigned char *p = buf;
2168
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002169 if( ssl->session_negotiate->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002170 {
2171 *olen = 0;
2172 return;
2173 }
2174
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002175 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding truncated hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002176
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002177 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
2178 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002179
2180 *p++ = 0x00;
2181 *p++ = 0x00;
2182
2183 *olen = 4;
2184}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002185#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002186
Hanno Beckera0e20d02019-05-15 14:03:01 +01002187#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker51de2d32019-04-26 15:46:55 +01002188static void ssl_write_cid_ext( mbedtls_ssl_context *ssl,
2189 unsigned char *buf,
2190 size_t *olen )
2191{
2192 unsigned char *p = buf;
2193 size_t ext_len;
2194 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
2195
2196 *olen = 0;
2197
2198 /* Skip writing the extension if we don't want to use it or if
2199 * the client hasn't offered it. */
2200 if( ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED )
2201 return;
2202
2203 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
2204 * which is at most 255, so the increment cannot overflow. */
2205 if( end < p || (size_t)( end - p ) < (unsigned)( ssl->own_cid_len + 5 ) )
2206 {
2207 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
2208 return;
2209 }
2210
2211 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding CID extension" ) );
2212
2213 /*
Hanno Beckerebcc9132019-05-15 10:26:32 +01002214 * Quoting draft-ietf-tls-dtls-connection-id-05
2215 * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
Hanno Becker51de2d32019-04-26 15:46:55 +01002216 *
2217 * struct {
2218 * opaque cid<0..2^8-1>;
2219 * } ConnectionId;
2220 */
2221
2222 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_CID >> 8 ) & 0xFF );
2223 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_CID ) & 0xFF );
2224 ext_len = (size_t) ssl->own_cid_len + 1;
2225 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
2226 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
2227
2228 *p++ = (uint8_t) ssl->own_cid_len;
2229 memcpy( p, ssl->own_cid, ssl->own_cid_len );
2230
2231 *olen = ssl->own_cid_len + 5;
2232}
Hanno Beckera0e20d02019-05-15 14:03:01 +01002233#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker51de2d32019-04-26 15:46:55 +01002234
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002235#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2236static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002237 unsigned char *buf,
2238 size_t *olen )
2239{
2240 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002241 const mbedtls_ssl_ciphersuite_t *suite = NULL;
2242 const mbedtls_cipher_info_t *cipher = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002243
Hanno Becker27b34d52017-10-20 14:24:51 +01002244 if( ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002245 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002246 {
2247 *olen = 0;
2248 return;
2249 }
2250
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01002251 /*
2252 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
2253 * from a client and then selects a stream or Authenticated Encryption
2254 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
2255 * encrypt-then-MAC response extension back to the client."
2256 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002257 if( ( suite = mbedtls_ssl_ciphersuite_from_id(
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01002258 ssl->session_negotiate->ciphersuite ) ) == NULL ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002259 ( cipher = mbedtls_cipher_info_from_type( suite->cipher ) ) == NULL ||
2260 cipher->mode != MBEDTLS_MODE_CBC )
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01002261 {
2262 *olen = 0;
2263 return;
2264 }
2265
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002266 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding encrypt then mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002267
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002268 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
2269 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002270
2271 *p++ = 0x00;
2272 *p++ = 0x00;
2273
2274 *olen = 4;
2275}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002276#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002277
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002278#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2279static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002280 unsigned char *buf,
2281 size_t *olen )
2282{
2283 unsigned char *p = buf;
2284
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002285 if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
2286 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002287 {
2288 *olen = 0;
2289 return;
2290 }
2291
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002292 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding extended master secret "
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002293 "extension" ) );
2294
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002295 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );
2296 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002297
2298 *p++ = 0x00;
2299 *p++ = 0x00;
2300
2301 *olen = 4;
2302}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002303#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002304
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002305#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2306static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002307 unsigned char *buf,
2308 size_t *olen )
2309{
2310 unsigned char *p = buf;
2311
2312 if( ssl->handshake->new_session_ticket == 0 )
2313 {
2314 *olen = 0;
2315 return;
2316 }
2317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002318 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding session ticket extension" ) );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002319
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002320 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
2321 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002322
2323 *p++ = 0x00;
2324 *p++ = 0x00;
2325
2326 *olen = 4;
2327}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002328#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002329
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002330static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002331 unsigned char *buf,
2332 size_t *olen )
2333{
2334 unsigned char *p = buf;
2335
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002336 if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION )
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002337 {
2338 *olen = 0;
2339 return;
2340 }
2341
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002342 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, secure renegotiation extension" ) );
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002343
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002344 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
2345 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002346
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002347#if defined(MBEDTLS_SSL_RENEGOTIATION)
2348 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002349 {
2350 *p++ = 0x00;
2351 *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF;
2352 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002353
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002354 memcpy( p, ssl->peer_verify_data, ssl->verify_data_len );
2355 p += ssl->verify_data_len;
2356 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
2357 p += ssl->verify_data_len;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002358 }
2359 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002360#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002361 {
2362 *p++ = 0x00;
2363 *p++ = 0x01;
2364 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002365 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02002366
2367 *olen = p - buf;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002368}
2369
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002370#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2371static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002372 unsigned char *buf,
2373 size_t *olen )
2374{
2375 unsigned char *p = buf;
2376
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002377 if( ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE )
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02002378 {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002379 *olen = 0;
2380 return;
2381 }
2382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002383 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, max_fragment_length extension" ) );
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002384
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002385 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
2386 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002387
2388 *p++ = 0x00;
2389 *p++ = 1;
2390
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02002391 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002392
2393 *olen = 5;
2394}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002395#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002396
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +02002397#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02002398 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002399static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002400 unsigned char *buf,
2401 size_t *olen )
2402{
2403 unsigned char *p = buf;
2404 ((void) ssl);
2405
Paul Bakker677377f2013-10-28 12:54:26 +01002406 if( ( ssl->handshake->cli_exts &
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002407 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT ) == 0 )
Paul Bakker677377f2013-10-28 12:54:26 +01002408 {
2409 *olen = 0;
2410 return;
2411 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002413 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, supported_point_formats extension" ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002414
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002415 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
2416 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002417
2418 *p++ = 0x00;
2419 *p++ = 2;
2420
2421 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002422 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002423
2424 *olen = 6;
2425}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02002426#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002427
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002428#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2429static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
2430 unsigned char *buf,
2431 size_t *olen )
2432{
Janos Follath865b3eb2019-12-16 11:46:15 +00002433 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002434 unsigned char *p = buf;
Angus Grattond8213d02016-05-25 20:56:48 +10002435 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002436 size_t kkpp_len;
2437
2438 *olen = 0;
2439
2440 /* Skip costly computation if not needed */
Hanno Beckere694c3e2017-12-27 21:34:08 +00002441 if( ssl->handshake->ciphersuite_info->key_exchange !=
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002442 MBEDTLS_KEY_EXCHANGE_ECJPAKE )
2443 return;
2444
2445 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, ecjpake kkpp extension" ) );
2446
2447 if( end - p < 4 )
2448 {
2449 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
2450 return;
2451 }
2452
2453 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
2454 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
2455
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02002456 ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
2457 p + 2, end - p - 2, &kkpp_len,
2458 ssl->conf->f_rng, ssl->conf->p_rng );
2459 if( ret != 0 )
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002460 {
2461 MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret );
2462 return;
2463 }
2464
2465 *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
2466 *p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
2467
2468 *olen = kkpp_len + 4;
2469}
2470#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2471
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002472#if defined(MBEDTLS_SSL_ALPN )
2473static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002474 unsigned char *buf, size_t *olen )
2475{
2476 if( ssl->alpn_chosen == NULL )
2477 {
2478 *olen = 0;
2479 return;
2480 }
2481
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002482 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding alpn extension" ) );
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002483
2484 /*
2485 * 0 . 1 ext identifier
2486 * 2 . 3 ext length
2487 * 4 . 5 protocol list length
2488 * 6 . 6 protocol name length
2489 * 7 . 7+n protocol name
2490 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002491 buf[0] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );
2492 buf[1] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF );
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002493
2494 *olen = 7 + strlen( ssl->alpn_chosen );
2495
2496 buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
2497 buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF );
2498
2499 buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
2500 buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF );
2501
2502 buf[6] = (unsigned char)( ( ( *olen - 7 ) ) & 0xFF );
2503
2504 memcpy( buf + 7, ssl->alpn_chosen, *olen - 7 );
2505}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002506#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002507
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002508#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
2509static int ssl_write_hello_verify_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002510{
Janos Follath865b3eb2019-12-16 11:46:15 +00002511 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002512 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002513 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002514
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002515 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello verify request" ) );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002516
2517 /*
2518 * struct {
2519 * ProtocolVersion server_version;
2520 * opaque cookie<0..2^8-1>;
2521 * } HelloVerifyRequest;
2522 */
2523
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002524 /* The RFC is not clear on this point, but sending the actual negotiated
2525 * version looks like the most interoperable thing to do. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002526 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002527 ssl->conf->transport, p );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002528 MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002529 p += 2;
2530
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002531 /* If we get here, f_cookie_check is not null */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002532 if( ssl->conf->f_cookie_write == NULL )
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002533 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002534 MBEDTLS_SSL_DEBUG_MSG( 1, ( "inconsistent cookie callbacks" ) );
2535 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002536 }
2537
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002538 /* Skip length byte until we know the length */
2539 cookie_len_byte = p++;
2540
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002541 if( ( ret = ssl->conf->f_cookie_write( ssl->conf->p_cookie,
Angus Grattond8213d02016-05-25 20:56:48 +10002542 &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +02002543 ssl->cli_id, ssl->cli_id_len ) ) != 0 )
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002544 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002545 MBEDTLS_SSL_DEBUG_RET( 1, "f_cookie_write", ret );
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002546 return( ret );
2547 }
2548
2549 *cookie_len_byte = (unsigned char)( p - ( cookie_len_byte + 1 ) );
2550
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002551 MBEDTLS_SSL_DEBUG_BUF( 3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002552
2553 ssl->out_msglen = p - ssl->out_msg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002554 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2555 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002556
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002557 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002558
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02002559 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002560 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02002561 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002562 return( ret );
2563 }
2564
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002565#if defined(MBEDTLS_SSL_PROTO_DTLS)
2566 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2567 ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
2568 {
2569 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
2570 return( ret );
2571 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01002572#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002573
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002574 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello verify request" ) );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002575
2576 return( 0 );
2577}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002578#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002579
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002580static int ssl_write_server_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002581{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002582#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002583 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002584#endif
Janos Follath865b3eb2019-12-16 11:46:15 +00002585 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002586 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002587 unsigned char *buf, *p;
2588
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002589 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002590
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002591#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002592 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002593 ssl->handshake->verify_cookie_len != 0 )
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002594 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002595 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client hello was not authenticated" ) );
2596 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002597
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02002598 return( ssl_write_hello_verify_request( ssl ) );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002599 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002600#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002601
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002602 if( ssl->conf->f_rng == NULL )
Paul Bakkera9a028e2013-11-21 17:31:06 +01002603 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002604 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
2605 return( MBEDTLS_ERR_SSL_NO_RNG );
Paul Bakkera9a028e2013-11-21 17:31:06 +01002606 }
2607
Paul Bakker5121ce52009-01-03 21:22:43 +00002608 /*
2609 * 0 . 0 handshake type
2610 * 1 . 3 handshake length
2611 * 4 . 5 protocol version
2612 * 6 . 9 UNIX time()
2613 * 10 . 37 random bytes
2614 */
2615 buf = ssl->out_msg;
2616 p = buf + 4;
2617
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002618 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002619 ssl->conf->transport, p );
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002620 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002621
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002622 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002623 buf[4], buf[5] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002624
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002625#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002626 t = mbedtls_time( NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +00002627 *p++ = (unsigned char)( t >> 24 );
2628 *p++ = (unsigned char)( t >> 16 );
2629 *p++ = (unsigned char)( t >> 8 );
2630 *p++ = (unsigned char)( t );
2631
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002632 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002633#else
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002634 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002635 return( ret );
2636
2637 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002638#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002639
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002640 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )
Paul Bakkera3d195c2011-11-27 21:07:34 +00002641 return( ret );
2642
2643 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +00002644
Paul Bakker48916f92012-09-16 19:57:18 +00002645 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002646
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002647 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002648
2649 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002650 * Resume is 0 by default, see ssl_handshake_init().
2651 * It may be already set to 1 by ssl_parse_session_ticket_ext().
2652 * If not, try looking up session ID in our cache.
Paul Bakker5121ce52009-01-03 21:22:43 +00002653 */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002654 if( ssl->handshake->resume == 0 &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002655#if defined(MBEDTLS_SSL_RENEGOTIATION)
2656 ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE &&
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002657#endif
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002658 ssl->session_negotiate->id_len != 0 &&
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002659 ssl->conf->f_get_cache != NULL &&
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01002660 ssl->conf->f_get_cache( ssl->conf->p_cache, ssl->session_negotiate ) == 0 )
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002661 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002662 MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from cache" ) );
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002663 ssl->handshake->resume = 1;
2664 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002665
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002666 if( ssl->handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002667 {
2668 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002669 * New session, create a new session id,
2670 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002671 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002672 ssl->state++;
2673
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002674#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002675 ssl->session_negotiate->start = mbedtls_time( NULL );
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002676#endif
2677
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002678#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002679 if( ssl->handshake->new_session_ticket != 0 )
2680 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002681 ssl->session_negotiate->id_len = n = 0;
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002682 memset( ssl->session_negotiate->id, 0, 32 );
2683 }
2684 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002685#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002686 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002687 ssl->session_negotiate->id_len = n = 32;
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002688 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id,
Paul Bakkera503a632013-08-14 13:48:06 +02002689 n ) ) != 0 )
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002690 return( ret );
2691 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002692 }
2693 else
2694 {
2695 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002696 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002697 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002698 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002699 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002700
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002701 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Paul Bakkerff60ee62010-03-16 21:09:09 +00002702 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002703 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Paul Bakkerff60ee62010-03-16 21:09:09 +00002704 return( ret );
2705 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002706 }
2707
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002708 /*
2709 * 38 . 38 session id length
2710 * 39 . 38+n session id
2711 * 39+n . 40+n chosen ciphersuite
2712 * 41+n . 41+n chosen compression alg.
2713 * 42+n . 43+n extensions length
2714 * 44+n . 43+n+m extensions
2715 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002716 *p++ = (unsigned char) ssl->session_negotiate->id_len;
2717 memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->id_len );
2718 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002719
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002720 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
2721 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
2722 MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +00002723 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002724
Paul Bakker48916f92012-09-16 19:57:18 +00002725 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 );
2726 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite );
2727 *p++ = (unsigned char)( ssl->session_negotiate->compression );
Paul Bakker5121ce52009-01-03 21:22:43 +00002728
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002729 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s",
2730 mbedtls_ssl_get_ciphersuite_name( ssl->session_negotiate->ciphersuite ) ) );
2731 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: 0x%02X",
Paul Bakker48916f92012-09-16 19:57:18 +00002732 ssl->session_negotiate->compression ) );
2733
Janos Follathc6dab2b2016-05-23 14:27:02 +01002734 /* Do not write the extensions if the protocol is SSLv3 */
2735#if defined(MBEDTLS_SSL_PROTO_SSL3)
2736 if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) )
2737 {
2738#endif
2739
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002740 /*
2741 * First write extensions, then the total length
2742 */
2743 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
2744 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002745
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002746#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002747 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
2748 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002749#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002750
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002751#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002752 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
2753 ext_len += olen;
Paul Bakker1f2bc622013-08-15 13:45:55 +02002754#endif
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002755
Hanno Beckera0e20d02019-05-15 14:03:01 +01002756#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker51de2d32019-04-26 15:46:55 +01002757 ssl_write_cid_ext( ssl, p + 2 + ext_len, &olen );
2758 ext_len += olen;
2759#endif
2760
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002761#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002762 ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );
2763 ext_len += olen;
2764#endif
2765
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002766#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002767 ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );
2768 ext_len += olen;
2769#endif
2770
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002771#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002772 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
2773 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002774#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002775
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +02002776#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01002777 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Ron Eldor755bb6a2018-02-14 19:30:48 +02002778 if ( mbedtls_ssl_ciphersuite_uses_ec(
2779 mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite ) ) )
2780 {
2781 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
2782 ext_len += olen;
2783 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002784#endif
2785
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002786#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2787 ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );
2788 ext_len += olen;
2789#endif
2790
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002791#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002792 ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
2793 ext_len += olen;
2794#endif
2795
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002796 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d", ext_len ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002797
Paul Bakkera7036632014-04-30 10:15:38 +02002798 if( ext_len > 0 )
2799 {
2800 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
2801 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
2802 p += ext_len;
2803 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002804
Janos Follathc6dab2b2016-05-23 14:27:02 +01002805#if defined(MBEDTLS_SSL_PROTO_SSL3)
2806 }
2807#endif
2808
Paul Bakker5121ce52009-01-03 21:22:43 +00002809 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002810 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2811 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002812
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02002813 ret = mbedtls_ssl_write_handshake_msg( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00002814
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002815 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002816
2817 return( ret );
2818}
2819
Gilles Peskineeccd8882020-03-10 12:19:08 +01002820#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002821static int ssl_write_certificate_request( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002822{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002823 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002824 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002825
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002826 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002827
Hanno Becker77adddc2019-02-07 12:32:43 +00002828 if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002829 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002830 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002831 ssl->state++;
2832 return( 0 );
2833 }
2834
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002835 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2836 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002837}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002838#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002839static int ssl_write_certificate_request( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002840{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002841 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002842 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002843 ssl->handshake->ciphersuite_info;
irwirc9bc3002020-04-01 13:46:36 +03002844 uint16_t dn_size, total_dn_size; /* excluding length bytes */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002845 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002846 unsigned char *buf, *p;
Angus Grattond8213d02016-05-25 20:56:48 +10002847 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002848 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002849 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002850
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002851 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002852
2853 ssl->state++;
2854
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002855#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2856 if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET )
2857 authmode = ssl->handshake->sni_authmode;
2858 else
2859#endif
2860 authmode = ssl->conf->authmode;
2861
Hanno Becker77adddc2019-02-07 12:32:43 +00002862 if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) ||
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002863 authmode == MBEDTLS_SSL_VERIFY_NONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002864 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002865 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002866 return( 0 );
2867 }
2868
2869 /*
2870 * 0 . 0 handshake type
2871 * 1 . 3 handshake length
2872 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002873 * 5 .. m-1 cert types
2874 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002875 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002876 * n .. n+1 length of all DNs
2877 * n+2 .. n+3 length of DN 1
2878 * n+4 .. ... Distinguished Name #1
2879 * ... .. ... length of DN 2, etc.
2880 */
2881 buf = ssl->out_msg;
2882 p = buf + 4;
2883
2884 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002885 * Supported certificate types
2886 *
2887 * ClientCertificateType certificate_types<1..2^8-1>;
2888 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002889 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002890 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002891
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002892#if defined(MBEDTLS_RSA_C)
2893 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002894#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002895#if defined(MBEDTLS_ECDSA_C)
2896 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002897#endif
2898
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002899 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002900 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002901
Paul Bakker577e0062013-08-28 11:57:20 +02002902 sa_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002903#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Paul Bakker926af752012-11-23 13:38:07 +01002904 /*
2905 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002906 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002907 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2908 *
2909 * struct {
2910 * HashAlgorithm hash;
2911 * SignatureAlgorithm signature;
2912 * } SignatureAndHashAlgorithm;
2913 *
2914 * enum { (255) } HashAlgorithm;
2915 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002916 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002917 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01002918 {
Simon Butcher99000142016-10-13 17:21:01 +01002919 const int *cur;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002920
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002921 /*
2922 * Supported signature algorithms
2923 */
Simon Butcher99000142016-10-13 17:21:01 +01002924 for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ )
2925 {
2926 unsigned char hash = mbedtls_ssl_hash_from_md_alg( *cur );
2927
2928 if( MBEDTLS_SSL_HASH_NONE == hash || mbedtls_ssl_set_calc_verify_md( ssl, hash ) )
2929 continue;
2930
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002931#if defined(MBEDTLS_RSA_C)
Simon Butcher99000142016-10-13 17:21:01 +01002932 p[2 + sa_len++] = hash;
2933 p[2 + sa_len++] = MBEDTLS_SSL_SIG_RSA;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002934#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002935#if defined(MBEDTLS_ECDSA_C)
Simon Butcher99000142016-10-13 17:21:01 +01002936 p[2 + sa_len++] = hash;
2937 p[2 + sa_len++] = MBEDTLS_SSL_SIG_ECDSA;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002938#endif
Simon Butcher99000142016-10-13 17:21:01 +01002939 }
Paul Bakker926af752012-11-23 13:38:07 +01002940
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002941 p[0] = (unsigned char)( sa_len >> 8 );
2942 p[1] = (unsigned char)( sa_len );
2943 sa_len += 2;
2944 p += sa_len;
Paul Bakker926af752012-11-23 13:38:07 +01002945 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002946#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002947
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002948 /*
2949 * DistinguishedName certificate_authorities<0..2^16-1>;
2950 * opaque DistinguishedName<1..2^16-1>;
2951 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002952 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002953
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002954 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002955
2956 if( ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED )
Paul Bakker5121ce52009-01-03 21:22:43 +00002957 {
Hanno Becker8bf74f32019-03-27 11:01:30 +00002958 /* NOTE: If trusted certificates are provisioned
2959 * via a CA callback (configured through
2960 * `mbedtls_ssl_conf_ca_cb()`, then the
2961 * CertificateRequest is currently left empty. */
2962
Janos Follath088ce432017-04-10 12:42:31 +01002963#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2964 if( ssl->handshake->sni_ca_chain != NULL )
2965 crt = ssl->handshake->sni_ca_chain;
2966 else
2967#endif
2968 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002969
Janos Follath088ce432017-04-10 12:42:31 +01002970 while( crt != NULL && crt->version != 0 )
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002971 {
irwirc9bc3002020-04-01 13:46:36 +03002972 /* It follows from RFC 5280 A.1 that this length
2973 * can be represented in at most 11 bits. */
2974 dn_size = (uint16_t) crt->subject_raw.len;
Janos Follath088ce432017-04-10 12:42:31 +01002975
irwirc9bc3002020-04-01 13:46:36 +03002976 if( end < p || (size_t)( end - p ) < 2 + (size_t) dn_size )
Janos Follath088ce432017-04-10 12:42:31 +01002977 {
2978 MBEDTLS_SSL_DEBUG_MSG( 1, ( "skipping CAs: buffer too short" ) );
2979 break;
2980 }
2981
2982 *p++ = (unsigned char)( dn_size >> 8 );
2983 *p++ = (unsigned char)( dn_size );
2984 memcpy( p, crt->subject_raw.p, dn_size );
2985 p += dn_size;
2986
2987 MBEDTLS_SSL_DEBUG_BUF( 3, "requested DN", p - dn_size, dn_size );
2988
2989 total_dn_size += 2 + dn_size;
2990 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002991 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002992 }
2993
Paul Bakker926af752012-11-23 13:38:07 +01002994 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002995 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2996 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002997 ssl->out_msg[4 + ct_len + sa_len] = (unsigned char)( total_dn_size >> 8 );
2998 ssl->out_msg[5 + ct_len + sa_len] = (unsigned char)( total_dn_size );
Paul Bakker5121ce52009-01-03 21:22:43 +00002999
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003000 ret = mbedtls_ssl_write_handshake_msg( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003001
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003002 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003003
3004 return( ret );
3005}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003006#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003007
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003008#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3009 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
3010static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01003011{
Janos Follath865b3eb2019-12-16 11:46:15 +00003012 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01003013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003014 if( ! mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECKEY ) )
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01003015 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003016 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
3017 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01003018 }
3019
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003020 if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx,
3021 mbedtls_pk_ec( *mbedtls_ssl_own_key( ssl ) ),
3022 MBEDTLS_ECDH_OURS ) ) != 0 )
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01003023 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003024 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01003025 return( ret );
3026 }
3027
3028 return( 0 );
3029}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003030#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
3031 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01003032
Gilles Peskineeccd8882020-03-10 12:19:08 +01003033#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003034 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003035static int ssl_resume_server_key_exchange( mbedtls_ssl_context *ssl,
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003036 size_t *signature_len )
Paul Bakker41c83d32013-03-20 14:39:14 +01003037{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003038 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3039 * signature length which will be added in ssl_write_server_key_exchange
3040 * after the call to ssl_prepare_server_key_exchange.
3041 * ssl_write_server_key_exchange also takes care of incrementing
3042 * ssl->out_msglen. */
3043 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Angus Grattond8213d02016-05-25 20:56:48 +10003044 size_t sig_max_len = ( ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003045 - sig_start );
Gilles Peskine8f97af72018-04-26 11:46:10 +02003046 int ret = ssl->conf->f_async_resume( ssl,
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003047 sig_start, signature_len, sig_max_len );
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003048 if( ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS )
3049 {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003050 ssl->handshake->async_in_progress = 0;
Gilles Peskine1febfef2018-04-30 11:54:39 +02003051 mbedtls_ssl_set_async_operation_data( ssl, NULL );
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003052 }
Gilles Peskined3eb0612018-01-08 17:07:44 +01003053 MBEDTLS_SSL_DEBUG_RET( 2, "ssl_resume_server_key_exchange", ret );
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003054 return( ret );
3055}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003056#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003057 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003058
Gilles Peskined3eb0612018-01-08 17:07:44 +01003059/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02003060 * calculating the signature if any, but excluding formatting the
3061 * signature and sending the message. */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003062static int ssl_prepare_server_key_exchange( mbedtls_ssl_context *ssl,
3063 size_t *signature_len )
Paul Bakker5690efc2011-05-26 13:16:06 +00003064{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003065 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003066 ssl->handshake->ciphersuite_info;
3067
Gilles Peskineeccd8882020-03-10 12:19:08 +01003068#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
3069#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01003070 unsigned char *dig_signed = NULL;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003071#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
3072#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01003073
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003074 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003075#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine22e695f2018-04-26 00:22:50 +02003076 (void) signature_len;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003077#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01003078
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003079 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
Paul Bakker5121ce52009-01-03 21:22:43 +00003080
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003081 /*
3082 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003083 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003084 *
3085 */
3086
3087 /*
3088 * - ECJPAKE key exchanges
3089 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003090#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
3091 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
3092 {
Janos Follath865b3eb2019-12-16 11:46:15 +00003093 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01003094 size_t len = 0;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003095
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003096 ret = mbedtls_ecjpake_write_round_two(
3097 &ssl->handshake->ecjpake_ctx,
3098 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10003099 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003100 ssl->conf->f_rng, ssl->conf->p_rng );
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003101 if( ret != 0 )
3102 {
3103 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
3104 return( ret );
3105 }
3106
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003107 ssl->out_msglen += len;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003108 }
3109#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
3110
Hanno Becker1aa267c2017-04-28 17:08:27 +01003111 /*
3112 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
3113 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
3114 * we use empty support identity hints here.
3115 **/
3116#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003117 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
3118 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
3119 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003120 {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003121 ssl->out_msg[ssl->out_msglen++] = 0x00;
3122 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003123 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003124#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
3125 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003126
Hanno Becker7e5437a2017-04-28 17:15:26 +01003127 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003128 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01003129 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003130#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
Hanno Becker1aa267c2017-04-28 17:08:27 +01003131 if( mbedtls_ssl_ciphersuite_uses_dhe( ciphersuite_info ) )
Paul Bakker48916f92012-09-16 19:57:18 +00003132 {
Janos Follath865b3eb2019-12-16 11:46:15 +00003133 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01003134 size_t len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003135
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01003136 if( ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL )
3137 {
3138 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no DH parameters set" ) );
3139 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3140 }
3141
Paul Bakker41c83d32013-03-20 14:39:14 +01003142 /*
3143 * Ephemeral DH parameters:
3144 *
3145 * struct {
3146 * opaque dh_p<1..2^16-1>;
3147 * opaque dh_g<1..2^16-1>;
3148 * opaque dh_Ys<1..2^16-1>;
3149 * } ServerDHParams;
3150 */
Hanno Beckerab740562017-10-04 13:15:37 +01003151 if( ( ret = mbedtls_dhm_set_group( &ssl->handshake->dhm_ctx,
3152 &ssl->conf->dhm_P,
3153 &ssl->conf->dhm_G ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003154 {
Hanno Beckerab740562017-10-04 13:15:37 +01003155 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_set_group", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01003156 return( ret );
3157 }
Paul Bakker48916f92012-09-16 19:57:18 +00003158
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003159 if( ( ret = mbedtls_dhm_make_params(
3160 &ssl->handshake->dhm_ctx,
3161 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
3162 ssl->out_msg + ssl->out_msglen, &len,
3163 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003164 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003165 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_params", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01003166 return( ret );
3167 }
3168
Gilles Peskineeccd8882020-03-10 12:19:08 +01003169#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003170 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003171#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003172
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003173 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003174
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003175 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
3176 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
3177 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
3178 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker41c83d32013-03-20 14:39:14 +01003179 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003180#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01003181
Hanno Becker1aa267c2017-04-28 17:08:27 +01003182 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003183 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01003184 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003185#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
Hanno Becker1aa267c2017-04-28 17:08:27 +01003186 if( mbedtls_ssl_ciphersuite_uses_ecdhe( ciphersuite_info ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00003187 {
Paul Bakker41c83d32013-03-20 14:39:14 +01003188 /*
3189 * Ephemeral ECDH parameters:
3190 *
3191 * struct {
3192 * ECParameters curve_params;
3193 * ECPoint public;
3194 * } ServerECDHParams;
3195 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003196 const mbedtls_ecp_curve_info **curve = NULL;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003197 const mbedtls_ecp_group_id *gid;
Janos Follath865b3eb2019-12-16 11:46:15 +00003198 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Simon Butcher600c5e62018-06-14 08:58:59 +01003199 size_t len = 0;
Gergely Budai987bfb52014-01-19 21:48:42 +01003200
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01003201 /* Match our preference list against the offered curves */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003202 for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ )
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01003203 for( curve = ssl->handshake->curves; *curve != NULL; curve++ )
3204 if( (*curve)->grp_id == *gid )
3205 goto curve_matching_done;
3206
3207curve_matching_done:
Manuel Pégourié-Gonnardb86145e2015-06-23 14:11:39 +02003208 if( curve == NULL || *curve == NULL )
Gergely Budai987bfb52014-01-19 21:48:42 +01003209 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003210 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no matching curve for ECDHE" ) );
3211 return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );
Gergely Budai987bfb52014-01-19 21:48:42 +01003212 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01003213
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003214 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDHE curve: %s", (*curve)->name ) );
Gergely Budai987bfb52014-01-19 21:48:42 +01003215
Andrzej Kurekf093a3d2019-02-01 02:50:36 -05003216 if( ( ret = mbedtls_ecdh_setup( &ssl->handshake->ecdh_ctx,
3217 (*curve)->grp_id ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003218 {
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +02003219 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecp_group_load", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01003220 return( ret );
3221 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003222
Gilles Peskinefe1c0932017-11-23 13:35:02 +01003223 if( ( ret = mbedtls_ecdh_make_params(
3224 &ssl->handshake->ecdh_ctx, &len,
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003225 ssl->out_msg + ssl->out_msglen,
Angus Grattond8213d02016-05-25 20:56:48 +10003226 MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
Gilles Peskinefe1c0932017-11-23 13:35:02 +01003227 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003228 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003229 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_params", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01003230 return( ret );
3231 }
3232
Gilles Peskineeccd8882020-03-10 12:19:08 +01003233#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003234 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003235#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003236
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003237 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003238
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05003239 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3240 MBEDTLS_DEBUG_ECDH_Q );
Paul Bakker41c83d32013-03-20 14:39:14 +01003241 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003242#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003243
Hanno Becker1aa267c2017-04-28 17:08:27 +01003244 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003245 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003246 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003247 * exchange parameters, compute and add the signature here.
3248 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003249 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003250#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Hanno Becker1aa267c2017-04-28 17:08:27 +01003251 if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003252 {
Gilles Peskine1004c192018-01-08 16:59:14 +01003253 size_t dig_signed_len = ssl->out_msg + ssl->out_msglen - dig_signed;
Gilles Peskineca1d7422018-04-24 11:53:22 +02003254 size_t hashlen = 0;
Gilles Peskinee1efdf92018-01-05 21:18:37 +01003255 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Janos Follath865b3eb2019-12-16 11:46:15 +00003256 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23f36802012-09-28 14:15:14 +00003257
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003258 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003259 * 2.1: Choose hash algorithm:
Hanno Becker4cb1f4d2017-10-10 15:59:57 +01003260 * A: For TLS 1.2, obey signature-hash-algorithm extension
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003261 * to choose appropriate hash.
3262 * B: For SSL3, TLS1.0, TLS1.1 and ECDHE_ECDSA, use SHA1
3263 * (RFC 4492, Sec. 5.4)
3264 * C: Otherwise, use MD5 + SHA1 (RFC 4346, Sec. 7.4.3)
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003265 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003266
3267 mbedtls_md_type_t md_alg;
3268
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003269#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003270 mbedtls_pk_type_t sig_alg =
3271 mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003272 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003273 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003274 /* A: For TLS 1.2, obey signature-hash-algorithm extension
3275 * (RFC 5246, Sec. 7.4.1.4.1). */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003276 if( sig_alg == MBEDTLS_PK_NONE ||
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003277 ( md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs,
3278 sig_alg ) ) == MBEDTLS_MD_NONE )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003279 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003280 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Hanno Becker4cb1f4d2017-10-10 15:59:57 +01003281 /* (... because we choose a cipher suite
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003282 * only if there is a matching hash.) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003283 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003284 }
3285 }
Paul Bakker577e0062013-08-28 11:57:20 +02003286 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003287#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3288#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3289 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003290 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003291 {
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003292 /* B: Default hash SHA1 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003293 md_alg = MBEDTLS_MD_SHA1;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003294 }
3295 else
Hanno Becker1aa267c2017-04-28 17:08:27 +01003296#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
3297 MBEDTLS_SSL_PROTO_TLS1_1 */
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003298 {
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003299 /* C: MD5 + SHA1 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003300 md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003301 }
3302
Hanno Becker7e5437a2017-04-28 17:15:26 +01003303 MBEDTLS_SSL_DEBUG_MSG( 3, ( "pick hash algorithm %d for signing", md_alg ) );
3304
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003305 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003306 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003307 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003308#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3309 defined(MBEDTLS_SSL_PROTO_TLS1_1)
3310 if( md_alg == MBEDTLS_MD_NONE )
Paul Bakker23f36802012-09-28 14:15:14 +00003311 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003312 hashlen = 36;
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01003313 ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash,
3314 dig_signed,
3315 dig_signed_len );
3316 if( ret != 0 )
3317 return( ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003318 }
3319 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003320#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
3321 MBEDTLS_SSL_PROTO_TLS1_1 */
3322#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
3323 defined(MBEDTLS_SSL_PROTO_TLS1_2)
3324 if( md_alg != MBEDTLS_MD_NONE )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003325 {
Gilles Peskineca1d7422018-04-24 11:53:22 +02003326 ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, &hashlen,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01003327 dig_signed,
3328 dig_signed_len,
3329 md_alg );
3330 if( ret != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003331 return( ret );
Paul Bakker23f36802012-09-28 14:15:14 +00003332 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003333 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003334#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
3335 MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02003336 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003337 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3338 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02003339 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003340
Gilles Peskineebd652f2018-01-05 21:18:59 +01003341 MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003342
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003343 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003344 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003345 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003346#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3347 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker23f36802012-09-28 14:15:14 +00003348 {
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003349 /*
3350 * For TLS 1.2, we need to specify signature and hash algorithm
Hanno Becker7e5437a2017-04-28 17:15:26 +01003351 * explicitly through a prefix to the signature.
3352 *
3353 * struct {
3354 * HashAlgorithm hash;
3355 * SignatureAlgorithm signature;
3356 * } SignatureAndHashAlgorithm;
3357 *
3358 * struct {
3359 * SignatureAndHashAlgorithm algorithm;
3360 * opaque signature<0..2^16-1>;
3361 * } DigitallySigned;
3362 *
3363 */
3364
Gilles Peskine1004c192018-01-08 16:59:14 +01003365 ssl->out_msg[ssl->out_msglen++] =
3366 mbedtls_ssl_hash_from_md_alg( md_alg );
3367 ssl->out_msg[ssl->out_msglen++] =
3368 mbedtls_ssl_sig_from_pk_alg( sig_alg );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003369 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003370#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003371
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003372#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003373 if( ssl->conf->f_async_sign_start != NULL )
3374 {
Gilles Peskine8f97af72018-04-26 11:46:10 +02003375 ret = ssl->conf->f_async_sign_start( ssl,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003376 mbedtls_ssl_own_cert( ssl ),
3377 md_alg, hash, hashlen );
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003378 switch( ret )
3379 {
3380 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3381 /* act as if f_async_sign was null */
3382 break;
3383 case 0:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003384 ssl->handshake->async_in_progress = 1;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003385 return( ssl_resume_server_key_exchange( ssl, signature_len ) );
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003386 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003387 ssl->handshake->async_in_progress = 1;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003388 return( MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS );
3389 default:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003390 MBEDTLS_SSL_DEBUG_RET( 1, "f_async_sign_start", ret );
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003391 return( ret );
3392 }
3393 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003394#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003395
3396 if( mbedtls_ssl_own_key( ssl ) == NULL )
3397 {
3398 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key" ) );
3399 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
3400 }
3401
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003402 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3403 * signature length which will be added in ssl_write_server_key_exchange
3404 * after the call to ssl_prepare_server_key_exchange.
3405 * ssl_write_server_key_exchange also takes care of incrementing
3406 * ssl->out_msglen. */
Gilles Peskine1004c192018-01-08 16:59:14 +01003407 if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ),
3408 md_alg, hash, hashlen,
3409 ssl->out_msg + ssl->out_msglen + 2,
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003410 signature_len,
Gilles Peskine1004c192018-01-08 16:59:14 +01003411 ssl->conf->f_rng,
3412 ssl->conf->p_rng ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003413 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003414 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02003415 return( ret );
Paul Bakker23f36802012-09-28 14:15:14 +00003416 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003417 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003418#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003419
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003420 return( 0 );
3421}
Paul Bakker1ef83d62012-04-11 12:09:53 +00003422
Gilles Peskined3eb0612018-01-08 17:07:44 +01003423/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003424 * that do not include a ServerKeyExchange message, do nothing. Either
3425 * way, if successful, move on to the next step in the SSL state
3426 * machine. */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003427static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl )
3428{
Janos Follath865b3eb2019-12-16 11:46:15 +00003429 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003430 size_t signature_len = 0;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003431#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003432 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003433 ssl->handshake->ciphersuite_info;
Gilles Peskineeccd8882020-03-10 12:19:08 +01003434#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003435
Gilles Peskined3eb0612018-01-08 17:07:44 +01003436 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
3437
Gilles Peskineeccd8882020-03-10 12:19:08 +01003438#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003439 /* Extract static ECDH parameters and abort if ServerKeyExchange
3440 * is not needed. */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003441 if( mbedtls_ssl_ciphersuite_no_pfs( ciphersuite_info ) )
3442 {
3443 /* For suites involving ECDH, extract DH parameters
3444 * from certificate at this point. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003445#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003446 if( mbedtls_ssl_ciphersuite_uses_ecdh( ciphersuite_info ) )
3447 {
3448 ssl_get_ecdh_params_from_cert( ssl );
3449 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003450#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003451
3452 /* Key exchanges not involving ephemeral keys don't use
3453 * ServerKeyExchange, so end here. */
3454 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
3455 ssl->state++;
3456 return( 0 );
3457 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003458#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003459
Gilles Peskineeccd8882020-03-10 12:19:08 +01003460#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003461 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003462 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003463 * signature operation, resume signing. */
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003464 if( ssl->handshake->async_in_progress != 0 )
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003465 {
3466 MBEDTLS_SSL_DEBUG_MSG( 2, ( "resuming signature operation" ) );
3467 ret = ssl_resume_server_key_exchange( ssl, &signature_len );
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003468 }
3469 else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003470#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003471 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003472 {
3473 /* ServerKeyExchange is needed. Prepare the message. */
3474 ret = ssl_prepare_server_key_exchange( ssl, &signature_len );
Gilles Peskined3eb0612018-01-08 17:07:44 +01003475 }
3476
3477 if( ret != 0 )
3478 {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003479 /* If we're starting to write a new message, set ssl->out_msglen
3480 * to 0. But if we're resuming after an asynchronous message,
3481 * out_msglen is the amount of data written so far and mst be
3482 * preserved. */
Gilles Peskined3eb0612018-01-08 17:07:44 +01003483 if( ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS )
3484 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server key exchange (pending)" ) );
3485 else
3486 ssl->out_msglen = 0;
3487 return( ret );
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003488 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003489
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003490 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003491 * ssl_prepare_server_key_exchange already wrote the signature
3492 * itself at its proper place in the output buffer. */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003493#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003494 if( signature_len != 0 )
3495 {
3496 ssl->out_msg[ssl->out_msglen++] = (unsigned char)( signature_len >> 8 );
3497 ssl->out_msg[ssl->out_msglen++] = (unsigned char)( signature_len );
3498
3499 MBEDTLS_SSL_DEBUG_BUF( 3, "my signature",
3500 ssl->out_msg + ssl->out_msglen,
3501 signature_len );
3502
3503 /* Skip over the already-written signature */
3504 ssl->out_msglen += signature_len;
3505 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01003506#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003507
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003508 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003509 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3510 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003511
3512 ssl->state++;
3513
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003514 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003515 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003516 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003517 return( ret );
3518 }
3519
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003520 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003521 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003522}
3523
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003524static int ssl_write_server_hello_done( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003525{
Janos Follath865b3eb2019-12-16 11:46:15 +00003526 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003527
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003528 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003529
3530 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003531 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3532 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003533
3534 ssl->state++;
3535
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003536#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003537 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003538 mbedtls_ssl_send_flight_completed( ssl );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003539#endif
3540
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003541 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003542 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003543 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003544 return( ret );
3545 }
3546
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003547#if defined(MBEDTLS_SSL_PROTO_DTLS)
3548 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3549 ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
3550 {
3551 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
3552 return( ret );
3553 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01003554#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003555
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003556 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003557
3558 return( 0 );
3559}
3560
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003561#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3562 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3563static int ssl_parse_client_dh_public( mbedtls_ssl_context *ssl, unsigned char **p,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003564 const unsigned char *end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003565{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003566 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003567 size_t n;
3568
3569 /*
3570 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3571 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003572 if( *p + 2 > end )
3573 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003574 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3575 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003576 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003577
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003578 n = ( (*p)[0] << 8 ) | (*p)[1];
3579 *p += 2;
3580
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003581 if( *p + n > end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003582 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003583 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3584 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003585 }
3586
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003587 if( ( ret = mbedtls_dhm_read_public( &ssl->handshake->dhm_ctx, *p, n ) ) != 0 )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003588 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003589 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_read_public", ret );
3590 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003591 }
3592
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003593 *p += n;
3594
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003595 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003596
Paul Bakker70df2fb2013-04-17 17:19:09 +02003597 return( ret );
3598}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003599#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3600 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003601
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003602#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3603 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003604
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003605#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003606static int ssl_resume_decrypt_pms( mbedtls_ssl_context *ssl,
3607 unsigned char *peer_pms,
3608 size_t *peer_pmslen,
3609 size_t peer_pmssize )
3610{
Gilles Peskine8f97af72018-04-26 11:46:10 +02003611 int ret = ssl->conf->f_async_resume( ssl,
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003612 peer_pms, peer_pmslen, peer_pmssize );
3613 if( ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS )
3614 {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003615 ssl->handshake->async_in_progress = 0;
Gilles Peskine1febfef2018-04-30 11:54:39 +02003616 mbedtls_ssl_set_async_operation_data( ssl, NULL );
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003617 }
3618 MBEDTLS_SSL_DEBUG_RET( 2, "ssl_decrypt_encrypted_pms", ret );
3619 return( ret );
3620}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003621#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003622
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003623static int ssl_decrypt_encrypted_pms( mbedtls_ssl_context *ssl,
3624 const unsigned char *p,
3625 const unsigned char *end,
3626 unsigned char *peer_pms,
3627 size_t *peer_pmslen,
3628 size_t peer_pmssize )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003629{
Janos Follath865b3eb2019-12-16 11:46:15 +00003630 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003631 mbedtls_pk_context *private_key = mbedtls_ssl_own_key( ssl );
3632 mbedtls_pk_context *public_key = &mbedtls_ssl_own_cert( ssl )->pk;
3633 size_t len = mbedtls_pk_get_len( public_key );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003634
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003635#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003636 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003637 * decryption operation, resume signing. */
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003638 if( ssl->handshake->async_in_progress != 0 )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003639 {
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003640 MBEDTLS_SSL_DEBUG_MSG( 2, ( "resuming decryption operation" ) );
3641 return( ssl_resume_decrypt_pms( ssl,
3642 peer_pms, peer_pmslen, peer_pmssize ) );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003643 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003644#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003645
3646 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003647 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003648 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003649#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
3650 defined(MBEDTLS_SSL_PROTO_TLS1_2)
3651 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003652 {
Philippe Antoine747fd532018-05-30 09:13:21 +02003653 if ( p + 2 > end ) {
3654 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3655 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
3656 }
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003657 if( *p++ != ( ( len >> 8 ) & 0xFF ) ||
3658 *p++ != ( ( len ) & 0xFF ) )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003659 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003660 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3661 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003662 }
3663 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003664#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003665
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003666 if( p + len != end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003667 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003668 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3669 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003670 }
3671
Gilles Peskine422ccab2018-01-11 18:29:01 +01003672 /*
3673 * Decrypt the premaster secret
3674 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003675#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003676 if( ssl->conf->f_async_decrypt_start != NULL )
3677 {
Gilles Peskine8f97af72018-04-26 11:46:10 +02003678 ret = ssl->conf->f_async_decrypt_start( ssl,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003679 mbedtls_ssl_own_cert( ssl ),
3680 p, len );
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003681 switch( ret )
3682 {
3683 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3684 /* act as if f_async_decrypt_start was null */
3685 break;
3686 case 0:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003687 ssl->handshake->async_in_progress = 1;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003688 return( ssl_resume_decrypt_pms( ssl,
3689 peer_pms,
3690 peer_pmslen,
3691 peer_pmssize ) );
3692 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003693 ssl->handshake->async_in_progress = 1;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003694 return( MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS );
3695 default:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003696 MBEDTLS_SSL_DEBUG_RET( 1, "f_async_decrypt_start", ret );
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003697 return( ret );
3698 }
3699 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003700#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003701
Gilles Peskine422ccab2018-01-11 18:29:01 +01003702 if( ! mbedtls_pk_can_do( private_key, MBEDTLS_PK_RSA ) )
3703 {
Gilles Peskine422ccab2018-01-11 18:29:01 +01003704 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no RSA private key" ) );
3705 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
3706 }
3707
3708 ret = mbedtls_pk_decrypt( private_key, p, len,
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003709 peer_pms, peer_pmslen, peer_pmssize,
3710 ssl->conf->f_rng, ssl->conf->p_rng );
3711 return( ret );
3712}
3713
3714static int ssl_parse_encrypted_pms( mbedtls_ssl_context *ssl,
3715 const unsigned char *p,
3716 const unsigned char *end,
3717 size_t pms_offset )
3718{
Janos Follath865b3eb2019-12-16 11:46:15 +00003719 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003720 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3721 unsigned char ver[2];
3722 unsigned char fake_pms[48], peer_pms[48];
3723 unsigned char mask;
3724 size_t i, peer_pmslen;
3725 unsigned int diff;
3726
Gilles Peskine0a8352b2018-06-13 18:16:41 +02003727 /* In case of a failure in decryption, the decryption may write less than
3728 * 2 bytes of output, but we always read the first two bytes. It doesn't
3729 * matter in the end because diff will be nonzero in that case due to
3730 * peer_pmslen being less than 48, and we only care whether diff is 0.
3731 * But do initialize peer_pms for robustness anyway. This also makes
3732 * memory analyzers happy (don't access uninitialized memory, even
3733 * if it's an unsigned char). */
3734 peer_pms[0] = peer_pms[1] = ~0;
3735
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003736 ret = ssl_decrypt_encrypted_pms( ssl, p, end,
3737 peer_pms,
3738 &peer_pmslen,
3739 sizeof( peer_pms ) );
3740
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003741#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003742 if ( ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS )
3743 return( ret );
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003744#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003745
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003746 mbedtls_ssl_write_version( ssl->handshake->max_major_ver,
Gilles Peskine2e333372018-04-24 13:22:10 +02003747 ssl->handshake->max_minor_ver,
3748 ssl->conf->transport, ver );
3749
3750 /* Avoid data-dependent branches while checking for invalid
3751 * padding, to protect against timing-based Bleichenbacher-type
3752 * attacks. */
3753 diff = (unsigned int) ret;
3754 diff |= peer_pmslen ^ 48;
3755 diff |= peer_pms[0] ^ ver[0];
3756 diff |= peer_pms[1] ^ ver[1];
3757
3758 /* mask = diff ? 0xff : 0x00 using bit operations to avoid branches */
3759 /* MSVC has a warning about unary minus on unsigned, but this is
3760 * well-defined and precisely what we want to do here */
3761#if defined(_MSC_VER)
3762#pragma warning( push )
3763#pragma warning( disable : 4146 )
3764#endif
3765 mask = - ( ( diff | - diff ) >> ( sizeof( unsigned int ) * 8 - 1 ) );
3766#if defined(_MSC_VER)
3767#pragma warning( pop )
3768#endif
Manuel Pégourié-Gonnardb9c93d02015-06-23 13:53:15 +02003769
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003770 /*
3771 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3772 * must not cause the connection to end immediately; instead, send a
3773 * bad_record_mac later in the handshake.
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003774 * To protect against timing-based variants of the attack, we must
3775 * not have any branch that depends on whether the decryption was
3776 * successful. In particular, always generate the fake premaster secret,
3777 * regardless of whether it will ultimately influence the output or not.
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003778 */
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003779 ret = ssl->conf->f_rng( ssl->conf->p_rng, fake_pms, sizeof( fake_pms ) );
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003780 if( ret != 0 )
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003781 {
Gilles Peskinee1416382018-04-26 10:23:21 +02003782 /* It's ok to abort on an RNG failure, since this does not reveal
3783 * anything about the RSA decryption. */
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003784 return( ret );
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003785 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003786
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003787#if defined(MBEDTLS_SSL_DEBUG_ALL)
Manuel Pégourié-Gonnardce60fbe2015-04-15 16:45:52 +02003788 if( diff != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003789 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003790#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003791
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003792 if( sizeof( ssl->handshake->premaster ) < pms_offset ||
3793 sizeof( ssl->handshake->premaster ) - pms_offset < 48 )
3794 {
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 Bakker70df2fb2013-04-17 17:19:09 +02003797 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003798 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003799
Gilles Peskine422ccab2018-01-11 18:29:01 +01003800 /* Set pms to either the true or the fake PMS, without
3801 * data-dependent branches. */
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003802 for( i = 0; i < ssl->handshake->pmslen; i++ )
3803 pms[i] = ( mask & fake_pms[i] ) | ( (~mask) & peer_pms[i] );
3804
3805 return( 0 );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003806}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003807#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
3808 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003809
Gilles Peskineeccd8882020-03-10 12:19:08 +01003810#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003811static int ssl_parse_client_psk_identity( mbedtls_ssl_context *ssl, unsigned char **p,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003812 const unsigned char *end )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003813{
Paul Bakker6db455e2013-09-18 17:29:31 +02003814 int ret = 0;
irwir6527bd62019-09-21 18:51:25 +03003815 uint16_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003816
Hanno Becker845b9462018-10-26 12:07:29 +01003817 if( ssl_conf_has_psk_or_cb( ssl->conf ) == 0 )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003818 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003819 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) );
3820 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakkerfbb17802013-04-17 19:10:21 +02003821 }
3822
3823 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003824 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003825 */
Hanno Becker83c9f492017-06-26 13:52:14 +01003826 if( end - *p < 2 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003827 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003828 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3829 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003830 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003831
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003832 n = ( (*p)[0] << 8 ) | (*p)[1];
3833 *p += 2;
3834
irwir6527bd62019-09-21 18:51:25 +03003835 if( n == 0 || n > end - *p )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003836 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003837 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3838 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakkerfbb17802013-04-17 19:10:21 +02003839 }
3840
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003841 if( ssl->conf->f_psk != NULL )
Paul Bakker6db455e2013-09-18 17:29:31 +02003842 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003843 if( ssl->conf->f_psk( ssl->conf->p_psk, ssl, *p, n ) != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003844 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003845 }
Manuel Pégourié-Gonnardd27680b2014-07-08 14:15:55 +02003846 else
Paul Bakker6db455e2013-09-18 17:29:31 +02003847 {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003848 /* Identity is not a big secret since clients send it in the clear,
3849 * but treat it carefully anyway, just in case */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003850 if( n != ssl->conf->psk_identity_len ||
3851 mbedtls_ssl_safer_memcmp( ssl->conf->psk_identity, *p, n ) != 0 )
Paul Bakker6db455e2013-09-18 17:29:31 +02003852 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003853 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003854 }
3855 }
3856
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003857 if( ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003858 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003859 MBEDTLS_SSL_DEBUG_BUF( 3, "Unknown PSK identity", *p, n );
Gilles Peskinec94f7352017-05-10 16:37:56 +02003860 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3861 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003862 return( MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY );
Paul Bakkerfbb17802013-04-17 19:10:21 +02003863 }
3864
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003865 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003866
Manuel Pégourié-Gonnardd27680b2014-07-08 14:15:55 +02003867 return( 0 );
Paul Bakkerfbb17802013-04-17 19:10:21 +02003868}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003869#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003870
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003871static int ssl_parse_client_key_exchange( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003872{
Janos Follath865b3eb2019-12-16 11:46:15 +00003873 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003874 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003875 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003876
Hanno Beckere694c3e2017-12-27 21:34:08 +00003877 ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003878
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003879 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003880
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003881#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003882 ( defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3883 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) )
3884 if( ( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3885 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ) &&
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003886 ( ssl->handshake->async_in_progress != 0 ) )
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003887 {
3888 /* We've already read a record and there is an asynchronous
3889 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003890 * record. */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003891 MBEDTLS_SSL_DEBUG_MSG( 3, ( "will resume decryption of previously-read record" ) );
3892 }
3893 else
3894#endif
Hanno Becker327c93b2018-08-15 13:56:18 +01003895 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003896 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003897 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003898 return( ret );
3899 }
3900
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003901 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003902 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003903
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003904 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003905 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003906 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3907 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003908 }
3909
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003910 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003911 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003912 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3913 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003914 }
3915
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003916#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
3917 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003918 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003919 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003920 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003921 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003922 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003923 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003924
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003925 if( p != end )
3926 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003927 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
3928 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003929 }
3930
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003931 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003932 ssl->handshake->premaster,
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +01003933 MBEDTLS_PREMASTER_SIZE,
Manuel Pégourié-Gonnard2d627642013-09-04 14:22:07 +02003934 &ssl->handshake->pmslen,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003935 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003936 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003937 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
3938 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003939 }
3940
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003941 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003942 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003943 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003944#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
3945#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3946 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3947 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3948 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
3949 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3950 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3951 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
3952 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003953 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003954 if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx,
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003955 p, end - p) ) != 0 )
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003956 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003957 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret );
3958 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003959 }
3960
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05003961 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3962 MBEDTLS_DEBUG_ECDH_QP );
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003963
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003964 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003965 &ssl->handshake->pmslen,
3966 ssl->handshake->premaster,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003967 MBEDTLS_MPI_MAX_SIZE,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003968 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003969 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003970 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
3971 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003972 }
3973
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05003974 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3975 MBEDTLS_DEBUG_ECDH_Z );
Paul Bakker5121ce52009-01-03 21:22:43 +00003976 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003977 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003978#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3979 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3980 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3981 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3982#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
3983 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003984 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003985 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003986 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003987 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
Paul Bakkerfbb17802013-04-17 19:10:21 +02003988 return( ret );
3989 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003990
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003991 if( p != end )
3992 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003993 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
3994 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003995 }
3996
Hanno Becker845b9462018-10-26 12:07:29 +01003997#if defined(MBEDTLS_USE_PSA_CRYPTO)
3998 /* For opaque PSKs, we perform the PSK-to-MS derivation atomatically
3999 * and skip the intermediate PMS. */
Hanno Beckerc1385c12018-11-05 12:44:27 +00004000 if( ssl_use_opaque_psk( ssl ) == 1 )
Hanno Becker845b9462018-10-26 12:07:29 +01004001 MBEDTLS_SSL_DEBUG_MSG( 1, ( "skip PMS generation for opaque PSK" ) );
4002 else
4003#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004004 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02004005 ciphersuite_info->key_exchange ) ) != 0 )
4006 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004007 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02004008 return( ret );
4009 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02004010 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004011 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004012#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
4013#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
4014 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02004015 {
Gilles Peskineb74a1c72018-04-24 13:09:22 +02004016#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004017 if ( ssl->handshake->async_in_progress != 0 )
Gilles Peskine2c6078e2018-01-12 13:46:43 +01004018 {
4019 /* There is an asynchronous operation in progress to
4020 * decrypt the encrypted premaster secret, so skip
4021 * directly to resuming this operation. */
4022 MBEDTLS_SSL_DEBUG_MSG( 3, ( "PSK identity already parsed" ) );
4023 /* Update p to skip the PSK identity. ssl_parse_encrypted_pms
4024 * won't actually use it, but maintain p anyway for robustness. */
4025 p += ssl->conf->psk_identity_len + 2;
4026 }
4027 else
Gilles Peskineb74a1c72018-04-24 13:09:22 +02004028#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02004029 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
4030 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004031 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02004032 return( ret );
4033 }
4034
Hanno Becker845b9462018-10-26 12:07:29 +01004035#if defined(MBEDTLS_USE_PSA_CRYPTO)
4036 /* Opaque PSKs are currently only supported for PSK-only. */
4037 if( ssl_use_opaque_psk( ssl ) == 1 )
4038 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
4039#endif
4040
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02004041 if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 2 ) ) != 0 )
4042 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004043 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_encrypted_pms" ), ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02004044 return( ret );
4045 }
4046
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004047 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02004048 ciphersuite_info->key_exchange ) ) != 0 )
4049 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004050 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02004051 return( ret );
4052 }
4053 }
4054 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004055#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
4056#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
4057 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004058 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004059 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
4060 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004061 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004062 return( ret );
4063 }
4064 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
4065 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004066 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004067 return( ret );
4068 }
4069
Hanno Becker845b9462018-10-26 12:07:29 +01004070#if defined(MBEDTLS_USE_PSA_CRYPTO)
4071 /* Opaque PSKs are currently only supported for PSK-only. */
4072 if( ssl_use_opaque_psk( ssl ) == 1 )
4073 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
4074#endif
4075
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01004076 if( p != end )
4077 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004078 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
4079 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01004080 }
4081
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004082 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02004083 ciphersuite_info->key_exchange ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004084 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004085 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02004086 return( ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004087 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004088 }
4089 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004090#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
4091#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
4092 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004093 {
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004094 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
4095 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004096 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004097 return( ret );
4098 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02004099
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004100 if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx,
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02004101 p, end - p ) ) != 0 )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004102 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004103 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret );
4104 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004105 }
4106
Hanno Becker845b9462018-10-26 12:07:29 +01004107#if defined(MBEDTLS_USE_PSA_CRYPTO)
4108 /* Opaque PSKs are currently only supported for PSK-only. */
4109 if( ssl_use_opaque_psk( ssl ) == 1 )
4110 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
4111#endif
4112
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05004113 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
4114 MBEDTLS_DEBUG_ECDH_QP );
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02004115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004116 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02004117 ciphersuite_info->key_exchange ) ) != 0 )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004118 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004119 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004120 return( ret );
4121 }
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02004122 }
4123 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004124#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
4125#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
4126 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01004127 {
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00004128 if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 0 ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01004129 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004130 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_parse_encrypted_pms_secret" ), ret );
Paul Bakker70df2fb2013-04-17 17:19:09 +02004131 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004132 }
4133 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004134 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004135#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02004136#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
4137 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
4138 {
4139 ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
4140 p, end - p );
4141 if( ret != 0 )
4142 {
4143 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
4144 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
4145 }
4146
4147 ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
4148 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
4149 ssl->conf->f_rng, ssl->conf->p_rng );
4150 if( ret != 0 )
4151 {
4152 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
4153 return( ret );
4154 }
4155 }
4156 else
4157#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004158 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004159 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
4160 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004161 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004162
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004163 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Paul Bakkerff60ee62010-03-16 21:09:09 +00004164 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004165 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Paul Bakkerff60ee62010-03-16 21:09:09 +00004166 return( ret );
4167 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004168
Paul Bakker5121ce52009-01-03 21:22:43 +00004169 ssl->state++;
4170
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004171 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004172
4173 return( 0 );
4174}
4175
Gilles Peskineeccd8882020-03-10 12:19:08 +01004176#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004177static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00004178{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004179 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004180 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00004181
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004182 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004183
Hanno Becker77adddc2019-02-07 12:32:43 +00004184 if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Paul Bakkered27a042013-04-18 22:46:23 +02004185 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004186 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
Paul Bakkered27a042013-04-18 22:46:23 +02004187 ssl->state++;
4188 return( 0 );
4189 }
4190
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004191 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
4192 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004193}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004194#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004195static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004196{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004197 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004198 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004199 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004200 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004201 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004202#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4203 mbedtls_pk_type_t pk_alg;
Paul Bakker577e0062013-08-28 11:57:20 +02004204#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004205 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01004206 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00004207 ssl->handshake->ciphersuite_info;
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004208 mbedtls_pk_context * peer_pk;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004209
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004210 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004211
Hanno Becker2a831a42019-02-07 13:17:25 +00004212 if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004213 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004214 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02004215 ssl->state++;
4216 return( 0 );
4217 }
4218
Hanno Becker2a831a42019-02-07 13:17:25 +00004219#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4220 if( ssl->session_negotiate->peer_cert == NULL )
4221 {
4222 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
4223 ssl->state++;
4224 return( 0 );
4225 }
4226#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4227 if( ssl->session_negotiate->peer_cert_digest == NULL )
4228 {
4229 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
4230 ssl->state++;
4231 return( 0 );
4232 }
4233#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4234
Simon Butcher99000142016-10-13 17:21:01 +01004235 /* Read the message without adding it to the checksum */
Hanno Becker327c93b2018-08-15 13:56:18 +01004236 ret = mbedtls_ssl_read_record( ssl, 0 /* no checksum update */ );
Simon Butcher99000142016-10-13 17:21:01 +01004237 if( 0 != ret )
Paul Bakker5121ce52009-01-03 21:22:43 +00004238 {
Hanno Becker327c93b2018-08-15 13:56:18 +01004239 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_read_record" ), ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004240 return( ret );
4241 }
4242
4243 ssl->state++;
4244
Simon Butcher99000142016-10-13 17:21:01 +01004245 /* Process the message contents */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004246 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4247 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00004248 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004249 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
4250 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00004251 }
4252
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004253 i = mbedtls_ssl_hs_hdr_len( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00004254
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004255#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4256 peer_pk = &ssl->handshake->peer_pubkey;
4257#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4258 if( ssl->session_negotiate->peer_cert == NULL )
4259 {
4260 /* Should never happen */
4261 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
4262 }
4263 peer_pk = &ssl->session_negotiate->peer_cert->pk;
4264#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4265
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004266 /*
4267 * struct {
4268 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4269 * opaque signature<0..2^16-1>;
4270 * } DigitallySigned;
4271 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004272#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
4273 defined(MBEDTLS_SSL_PROTO_TLS1_1)
4274 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01004275 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004276 md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004277 hashlen = 36;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004278
4279 /* For ECDSA, use SHA-1, not MD-5 + SHA-1 */
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004280 if( mbedtls_pk_can_do( peer_pk, MBEDTLS_PK_ECDSA ) )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004281 {
4282 hash_start += 16;
4283 hashlen -= 16;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004284 md_alg = MBEDTLS_MD_SHA1;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004285 }
Paul Bakker926af752012-11-23 13:38:07 +01004286 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02004287 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004288#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 ||
4289 MBEDTLS_SSL_PROTO_TLS1_1 */
4290#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4291 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004292 {
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004293 if( i + 2 > ssl->in_hslen )
4294 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004295 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
4296 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004297 }
4298
Paul Bakker5121ce52009-01-03 21:22:43 +00004299 /*
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004300 * Hash
Paul Bakker5121ce52009-01-03 21:22:43 +00004301 */
Simon Butcher99000142016-10-13 17:21:01 +01004302 md_alg = mbedtls_ssl_md_alg_from_hash( ssl->in_msg[i] );
4303
4304 if( md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md( ssl, ssl->in_msg[i] ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00004305 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004306 MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg"
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004307 " for verify message" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004308 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker926af752012-11-23 13:38:07 +01004309 }
4310
Simon Butcher99000142016-10-13 17:21:01 +01004311#if !defined(MBEDTLS_MD_SHA1)
4312 if( MBEDTLS_MD_SHA1 == md_alg )
4313 hash_start += 16;
4314#endif
Paul Bakker926af752012-11-23 13:38:07 +01004315
Manuel Pégourié-Gonnardbfe32ef2013-08-22 14:55:30 +02004316 /* Info from md_alg will be used instead */
4317 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004318
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004319 i++;
4320
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004321 /*
4322 * Signature
4323 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004324 if( ( pk_alg = mbedtls_ssl_pk_alg_from_sig( ssl->in_msg[i] ) )
4325 == MBEDTLS_PK_NONE )
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004326 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004327 MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg"
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004328 " for verify message" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004329 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004330 }
4331
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004332 /*
4333 * Check the certificate's key type matches the signature alg
4334 */
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004335 if( !mbedtls_pk_can_do( peer_pk, pk_alg ) )
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004336 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004337 MBEDTLS_SSL_DEBUG_MSG( 1, ( "sig_alg doesn't match cert key" ) );
4338 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004339 }
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004340
4341 i++;
Paul Bakker577e0062013-08-28 11:57:20 +02004342 }
4343 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004344#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02004345 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004346 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
4347 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004348 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004349
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004350 if( i + 2 > ssl->in_hslen )
4351 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004352 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
4353 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004354 }
4355
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004356 sig_len = ( ssl->in_msg[i] << 8 ) | ssl->in_msg[i+1];
4357 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004358
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004359 if( i + sig_len != ssl->in_hslen )
Paul Bakker5121ce52009-01-03 21:22:43 +00004360 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004361 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
4362 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00004363 }
4364
Simon Butcher99000142016-10-13 17:21:01 +01004365 /* Calculate hash and verify signature */
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02004366 {
4367 size_t dummy_hlen;
4368 ssl->handshake->calc_verify( ssl, hash, &dummy_hlen );
4369 }
Simon Butcher99000142016-10-13 17:21:01 +01004370
Hanno Beckera1ab9be2019-02-06 18:31:04 +00004371 if( ( ret = mbedtls_pk_verify( peer_pk,
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004372 md_alg, hash_start, hashlen,
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004373 ssl->in_msg + i, sig_len ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00004374 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004375 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004376 return( ret );
4377 }
4378
Simon Butcher99000142016-10-13 17:21:01 +01004379 mbedtls_ssl_update_handshake_status( ssl );
4380
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004381 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004382
Paul Bakkered27a042013-04-18 22:46:23 +02004383 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004384}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004385#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004387#if defined(MBEDTLS_SSL_SESSION_TICKETS)
4388static int ssl_write_new_session_ticket( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004389{
Janos Follath865b3eb2019-12-16 11:46:15 +00004390 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004391 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004392 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004393
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004394 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write new session ticket" ) );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004395
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004396 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4397 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004398
4399 /*
4400 * struct {
4401 * uint32 ticket_lifetime_hint;
4402 * opaque ticket<0..2^16-1>;
4403 * } NewSessionTicket;
4404 *
4405 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4406 * 8 . 9 ticket_len (n)
4407 * 10 . 9+n ticket content
4408 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004409
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02004410 if( ( ret = ssl->conf->f_ticket_write( ssl->conf->p_ticket,
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +02004411 ssl->session_negotiate,
4412 ssl->out_msg + 10,
Angus Grattond8213d02016-05-25 20:56:48 +10004413 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004414 &tlen, &lifetime ) ) != 0 )
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004415 {
Manuel Pégourié-Gonnarda4a47352015-05-15 15:14:54 +02004416 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_write", ret );
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004417 tlen = 0;
4418 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004419
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004420 ssl->out_msg[4] = ( lifetime >> 24 ) & 0xFF;
4421 ssl->out_msg[5] = ( lifetime >> 16 ) & 0xFF;
4422 ssl->out_msg[6] = ( lifetime >> 8 ) & 0xFF;
4423 ssl->out_msg[7] = ( lifetime ) & 0xFF;
4424
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004425 ssl->out_msg[8] = (unsigned char)( ( tlen >> 8 ) & 0xFF );
4426 ssl->out_msg[9] = (unsigned char)( ( tlen ) & 0xFF );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004427
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004428 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004429
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004430 /*
4431 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4432 * ChangeCipherSpec share the same state.
4433 */
4434 ssl->handshake->new_session_ticket = 0;
4435
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02004436 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004437 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02004438 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004439 return( ret );
4440 }
4441
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004442 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write new session ticket" ) );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004443
4444 return( 0 );
4445}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004446#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004447
Paul Bakker5121ce52009-01-03 21:22:43 +00004448/*
Paul Bakker1961b702013-01-25 14:49:24 +01004449 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004450 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004451int mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00004452{
4453 int ret = 0;
4454
Manuel Pégourié-Gonnarddba460f2015-06-24 22:59:30 +02004455 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004456 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00004457
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004458 MBEDTLS_SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) );
Paul Bakker1961b702013-01-25 14:49:24 +01004459
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004460 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
Paul Bakker1961b702013-01-25 14:49:24 +01004461 return( ret );
4462
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004463#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02004464 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004465 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02004466 {
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02004467 if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02004468 return( ret );
4469 }
Hanno Beckerbc2498a2018-08-28 10:13:29 +01004470#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02004471
Paul Bakker1961b702013-01-25 14:49:24 +01004472 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00004473 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004474 case MBEDTLS_SSL_HELLO_REQUEST:
4475 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004476 break;
4477
Paul Bakker1961b702013-01-25 14:49:24 +01004478 /*
4479 * <== ClientHello
4480 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004481 case MBEDTLS_SSL_CLIENT_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01004482 ret = ssl_parse_client_hello( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00004483 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004484
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004485#if defined(MBEDTLS_SSL_PROTO_DTLS)
4486 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
4487 return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED );
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004488#endif
4489
Paul Bakker1961b702013-01-25 14:49:24 +01004490 /*
4491 * ==> ServerHello
4492 * Certificate
4493 * ( ServerKeyExchange )
4494 * ( CertificateRequest )
4495 * ServerHelloDone
4496 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004497 case MBEDTLS_SSL_SERVER_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01004498 ret = ssl_write_server_hello( ssl );
4499 break;
4500
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004501 case MBEDTLS_SSL_SERVER_CERTIFICATE:
4502 ret = mbedtls_ssl_write_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004503 break;
4504
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004505 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01004506 ret = ssl_write_server_key_exchange( ssl );
4507 break;
4508
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004509 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Paul Bakker1961b702013-01-25 14:49:24 +01004510 ret = ssl_write_certificate_request( ssl );
4511 break;
4512
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004513 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Paul Bakker1961b702013-01-25 14:49:24 +01004514 ret = ssl_write_server_hello_done( ssl );
4515 break;
4516
4517 /*
4518 * <== ( Certificate/Alert )
4519 * ClientKeyExchange
4520 * ( CertificateVerify )
4521 * ChangeCipherSpec
4522 * Finished
4523 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004524 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
4525 ret = mbedtls_ssl_parse_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004526 break;
4527
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004528 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01004529 ret = ssl_parse_client_key_exchange( ssl );
4530 break;
4531
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004532 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Paul Bakker1961b702013-01-25 14:49:24 +01004533 ret = ssl_parse_certificate_verify( ssl );
4534 break;
4535
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004536 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
4537 ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004538 break;
4539
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004540 case MBEDTLS_SSL_CLIENT_FINISHED:
4541 ret = mbedtls_ssl_parse_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004542 break;
4543
4544 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004545 * ==> ( NewSessionTicket )
4546 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004547 * Finished
4548 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004549 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4550#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02004551 if( ssl->handshake->new_session_ticket != 0 )
4552 ret = ssl_write_new_session_ticket( ssl );
4553 else
Paul Bakkera503a632013-08-14 13:48:06 +02004554#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004555 ret = mbedtls_ssl_write_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004556 break;
4557
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004558 case MBEDTLS_SSL_SERVER_FINISHED:
4559 ret = mbedtls_ssl_write_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004560 break;
4561
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004562 case MBEDTLS_SSL_FLUSH_BUFFERS:
4563 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
4564 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004565 break;
4566
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004567 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
4568 mbedtls_ssl_handshake_wrapup( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004569 break;
4570
4571 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004572 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
4573 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00004574 }
4575
Paul Bakker5121ce52009-01-03 21:22:43 +00004576 return( ret );
4577}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004578#endif /* MBEDTLS_SSL_SRV_C */