blob: 5439f6d617e02cc9ba10c2f6747d3637e9e81ecd [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/debug.h"
39#include "mbedtls/ssl.h"
Manuel Pégourié-Gonnard5e94dde2015-05-26 11:57:05 +020040#include "mbedtls/ssl_internal.h"
Rich Evans00ab4702015-02-06 13:43:58 +000041
42#include <string.h>
43
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000045#include "mbedtls/ecp.h"
Paul Bakker41c83d32013-03-20 14:39:14 +010046#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010049#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020050#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000051
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020052#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +020053/* Implementation that should never be optimized out by the compiler */
54static void mbedtls_zeroize( void *v, size_t n ) {
55 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
56}
Paul Bakker606b4ba2013-08-14 16:52:14 +020057#endif
58
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020059#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
60int mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020061 const unsigned char *info,
62 size_t ilen )
63{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +020064 if( ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020065 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020066
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020067 mbedtls_free( ssl->cli_id );
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020068
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +020069 if( ( ssl->cli_id = mbedtls_calloc( 1, ilen ) ) == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +020070 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020071
72 memcpy( ssl->cli_id, info, ilen );
73 ssl->cli_id_len = ilen;
74
75 return( 0 );
76}
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020077
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +020078void mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020079 mbedtls_ssl_cookie_write_t *f_cookie_write,
80 mbedtls_ssl_cookie_check_t *f_cookie_check,
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020081 void *p_cookie )
82{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +020083 conf->f_cookie_write = f_cookie_write;
84 conf->f_cookie_check = f_cookie_check;
85 conf->p_cookie = p_cookie;
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +020086}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020087#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +020088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020089#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020090static int ssl_parse_servername_ext( mbedtls_ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +000091 const unsigned char *buf,
Paul Bakker5701cdc2012-09-27 21:49:42 +000092 size_t len )
93{
94 int ret;
95 size_t servername_list_size, hostname_len;
Paul Bakker23f36802012-09-28 14:15:14 +000096 const unsigned char *p;
Paul Bakker5701cdc2012-09-27 21:49:42 +000097
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020098 MBEDTLS_SSL_DEBUG_MSG( 3, ( "parse ServerName extension" ) );
Manuel Pégourié-Gonnard96ea2f22014-02-25 12:26:29 +010099
Paul Bakker5701cdc2012-09-27 21:49:42 +0000100 servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
101 if( servername_list_size + 2 != len )
102 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200103 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200104 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
105 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000107 }
108
109 p = buf + 2;
110 while( servername_list_size > 0 )
111 {
112 hostname_len = ( ( p[1] << 8 ) | p[2] );
113 if( hostname_len + 3 > servername_list_size )
114 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200115 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200116 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
117 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200118 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000119 }
120
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200121 if( p[0] == MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME )
Paul Bakker5701cdc2012-09-27 21:49:42 +0000122 {
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +0200123 ret = ssl->conf->f_sni( ssl->conf->p_sni,
124 ssl, p + 3, hostname_len );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000125 if( ret != 0 )
126 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200127 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_sni_wrapper", ret );
128 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
129 MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME );
130 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000131 }
Paul Bakker81420ab2012-10-23 10:31:15 +0000132 return( 0 );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000133 }
134
135 servername_list_size -= hostname_len + 3;
Paul Bakker23f36802012-09-28 14:15:14 +0000136 p += hostname_len + 3;
137 }
138
139 if( servername_list_size != 0 )
140 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200141 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200142 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
143 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200144 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000145 }
146
147 return( 0 );
148}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200149#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +0000150
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +0000152 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +0000153 size_t len )
154{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200155#if defined(MBEDTLS_SSL_RENEGOTIATION)
156 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100157 {
158 /* Check verify-data in constant-time. The length OTOH is no secret */
159 if( len != 1 + ssl->verify_data_len ||
160 buf[0] != ssl->verify_data_len ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200161 mbedtls_ssl_safer_memcmp( buf + 1, ssl->peer_verify_data,
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100162 ssl->verify_data_len ) != 0 )
163 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200164 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +0200165 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
166 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200167 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100168 }
169 }
170 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200171#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +0000172 {
173 if( len != 1 || buf[0] != 0x0 )
174 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200175 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +0200176 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
177 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200178 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +0000179 }
180
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200181 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +0000182 }
Paul Bakker48916f92012-09-16 19:57:18 +0000183
184 return( 0 );
185}
186
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200187#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
188 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100189
190/*
191 * Status of the implementation of signature-algorithms extension:
192 *
193 * Currently, we are only considering the signature-algorithm extension
194 * to pick a ciphersuite which allows us to send the ServerKeyExchange
195 * message with a signature-hash combination that the user allows.
196 *
197 * We do *not* check whether all certificates in our certificate
198 * chain are signed with an allowed signature-hash pair.
199 * This needs to be done at a later stage.
200 *
201 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200202static int ssl_parse_signature_algorithms_ext( mbedtls_ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +0000203 const unsigned char *buf,
204 size_t len )
205{
206 size_t sig_alg_list_size;
Hanno Becker7e5437a2017-04-28 17:15:26 +0100207
Paul Bakker23f36802012-09-28 14:15:14 +0000208 const unsigned char *p;
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200209 const unsigned char *end = buf + len;
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200210
Hanno Becker7e5437a2017-04-28 17:15:26 +0100211 mbedtls_md_type_t md_cur;
212 mbedtls_pk_type_t sig_cur;
Paul Bakker23f36802012-09-28 14:15:14 +0000213
214 sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
215 if( sig_alg_list_size + 2 != len ||
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200216 sig_alg_list_size % 2 != 0 )
Paul Bakker23f36802012-09-28 14:15:14 +0000217 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200218 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200219 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
220 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200221 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker23f36802012-09-28 14:15:14 +0000222 }
223
Hanno Becker7e5437a2017-04-28 17:15:26 +0100224 /* Currently we only guarantee signing the ServerKeyExchange message according
225 * to the constraints specified in this extension (see above), so it suffices
226 * to remember only one suitable hash for each possible signature algorithm.
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200227 *
Hanno Becker7e5437a2017-04-28 17:15:26 +0100228 * This will change when we also consider certificate signatures,
229 * in which case we will need to remember the whole signature-hash
230 * pair list from the extension.
Manuel Pégourié-Gonnard08e81e02014-07-08 12:56:25 +0200231 */
Hanno Becker7e5437a2017-04-28 17:15:26 +0100232
233 for( p = buf + 2; p < end; p += 2 )
234 {
235 /* Silently ignore unknown signature or hash algorithms. */
236
237 if( ( sig_cur = mbedtls_ssl_pk_alg_from_sig( p[1] ) ) == MBEDTLS_PK_NONE )
238 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100239 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext"
240 " unknown sig alg encoding %d", p[1] ) );
Hanno Becker7e5437a2017-04-28 17:15:26 +0100241 continue;
242 }
243
244 /* Check if we support the hash the user proposes */
245 md_cur = mbedtls_ssl_md_alg_from_hash( p[0] );
246 if( md_cur == MBEDTLS_MD_NONE )
247 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100248 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext:"
249 " unknown hash alg encoding %d", p[0] ) );
Hanno Becker7e5437a2017-04-28 17:15:26 +0100250 continue;
251 }
252
253 if( mbedtls_ssl_check_sig_hash( ssl, md_cur ) == 0 )
254 {
255 mbedtls_ssl_sig_hash_set_add( &ssl->handshake->hash_algs, sig_cur, md_cur );
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100256 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext:"
257 " match sig %d and hash %d",
Hanno Becker7e5437a2017-04-28 17:15:26 +0100258 sig_cur, md_cur ) );
259 }
260 else
261 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100262 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: "
263 "hash alg %d not supported", md_cur ) );
Paul Bakker23f36802012-09-28 14:15:14 +0000264 }
Paul Bakker23f36802012-09-28 14:15:14 +0000265 }
266
Paul Bakker23f36802012-09-28 14:15:14 +0000267 return( 0 );
268}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200269#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
270 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
Paul Bakker23f36802012-09-28 14:15:14 +0000271
Robert Cragie136884c2015-10-02 13:34:31 +0100272#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100273 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200274static int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200275 const unsigned char *buf,
276 size_t len )
Paul Bakker41c83d32013-03-20 14:39:14 +0100277{
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200278 size_t list_size, our_size;
Paul Bakker41c83d32013-03-20 14:39:14 +0100279 const unsigned char *p;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280 const mbedtls_ecp_curve_info *curve_info, **curves;
Paul Bakker41c83d32013-03-20 14:39:14 +0100281
282 list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
283 if( list_size + 2 != len ||
284 list_size % 2 != 0 )
285 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200286 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200287 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
288 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200289 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker41c83d32013-03-20 14:39:14 +0100290 }
291
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200292 /* Should never happen unless client duplicates the extension */
293 if( ssl->handshake->curves != NULL )
294 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200295 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200296 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
297 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200298 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard43c3b282014-10-17 12:42:11 +0200299 }
300
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +0100301 /* Don't allow our peer to make us allocate too much memory,
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200302 * and leave room for a final 0 */
303 our_size = list_size / 2 + 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200304 if( our_size > MBEDTLS_ECP_DP_MAX )
305 our_size = MBEDTLS_ECP_DP_MAX;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200306
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200307 if( ( curves = mbedtls_calloc( our_size, sizeof( *curves ) ) ) == NULL )
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200308 {
309 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
310 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200311 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200312 }
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200313
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200314 ssl->handshake->curves = curves;
315
Paul Bakker41c83d32013-03-20 14:39:14 +0100316 p = buf + 2;
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200317 while( list_size > 0 && our_size > 1 )
Paul Bakker41c83d32013-03-20 14:39:14 +0100318 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200319 curve_info = mbedtls_ecp_curve_info_from_tls_id( ( p[0] << 8 ) | p[1] );
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200320
Manuel Pégourié-Gonnardf24b4a72013-09-23 18:14:50 +0200321 if( curve_info != NULL )
Paul Bakker41c83d32013-03-20 14:39:14 +0100322 {
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +0200323 *curves++ = curve_info;
324 our_size--;
Paul Bakker41c83d32013-03-20 14:39:14 +0100325 }
326
327 list_size -= 2;
328 p += 2;
329 }
330
331 return( 0 );
332}
333
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200334static int ssl_parse_supported_point_formats( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200335 const unsigned char *buf,
336 size_t len )
Paul Bakker41c83d32013-03-20 14:39:14 +0100337{
338 size_t list_size;
339 const unsigned char *p;
340
341 list_size = buf[0];
342 if( list_size + 1 != len )
343 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200344 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200345 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
346 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200347 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker41c83d32013-03-20 14:39:14 +0100348 }
349
Manuel Pégourié-Gonnardc1b46d02015-09-16 11:18:32 +0200350 p = buf + 1;
Paul Bakker41c83d32013-03-20 14:39:14 +0100351 while( list_size > 0 )
352 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200353 if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
354 p[0] == MBEDTLS_ECP_PF_COMPRESSED )
Paul Bakker41c83d32013-03-20 14:39:14 +0100355 {
Robert Cragie136884c2015-10-02 13:34:31 +0100356#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200357 ssl->handshake->ecdh_ctx.point_format = p[0];
Robert Cragie136884c2015-10-02 13:34:31 +0100358#endif
Robert Cragieae8535d2015-10-06 17:11:18 +0100359#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Robert Cragie136884c2015-10-02 13:34:31 +0100360 ssl->handshake->ecjpake_ctx.point_format = p[0];
361#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200362 MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
Paul Bakker41c83d32013-03-20 14:39:14 +0100363 return( 0 );
364 }
365
366 list_size--;
367 p++;
368 }
369
370 return( 0 );
371}
Robert Cragieae8535d2015-10-06 17:11:18 +0100372#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
373 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +0100374
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200375#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
376static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
377 const unsigned char *buf,
378 size_t len )
379{
380 int ret;
381
382 if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
383 {
384 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
385 return( 0 );
386 }
387
388 if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
389 buf, len ) ) != 0 )
390 {
391 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200392 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
393 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200394 return( ret );
395 }
396
397 /* Only mark the extension as OK when we're sure it is */
398 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
399
400 return( 0 );
401}
402#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
403
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200404#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
405static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200406 const unsigned char *buf,
407 size_t len )
408{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 if( len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID )
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200410 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200411 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200412 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
413 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200414 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200415 }
416
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200417 ssl->session_negotiate->mfl_code = buf[0];
418
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200419 return( 0 );
420}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200421#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200422
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200423#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
424static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200425 const unsigned char *buf,
426 size_t len )
427{
428 if( len != 0 )
429 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200430 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200431 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
432 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200433 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200434 }
435
436 ((void) buf);
437
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200438 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200439 ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200440
441 return( 0 );
442}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
446static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100447 const unsigned char *buf,
448 size_t len )
449{
450 if( len != 0 )
451 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200452 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200453 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
454 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200455 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100456 }
457
458 ((void) buf);
459
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200460 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200461 ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100462 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200463 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100464 }
465
466 return( 0 );
467}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200468#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100469
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200470#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
471static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200472 const unsigned char *buf,
473 size_t len )
474{
475 if( len != 0 )
476 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200477 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200478 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
479 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200480 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200481 }
482
483 ((void) buf);
484
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200485 if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200486 ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200487 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200488 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200489 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200490
491 return( 0 );
492}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200493#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200494
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200495#if defined(MBEDTLS_SSL_SESSION_TICKETS)
496static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200497 unsigned char *buf,
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200498 size_t len )
499{
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200500 int ret;
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200501 mbedtls_ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200502
Manuel Pégourié-Gonnardbae389b2015-06-24 10:45:58 +0200503 mbedtls_ssl_session_init( &session );
504
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200505 if( ssl->conf->f_ticket_parse == NULL ||
506 ssl->conf->f_ticket_write == NULL )
507 {
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200508 return( 0 );
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200509 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200510
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200511 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200512 ssl->handshake->new_session_ticket = 1;
513
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200514 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", len ) );
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200515
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200516 if( len == 0 )
517 return( 0 );
518
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200519#if defined(MBEDTLS_SSL_RENEGOTIATION)
520 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200521 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200522 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket rejected: renegotiating" ) );
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200523 return( 0 );
524 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200525#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200526
527 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200528 * Failures are ok: just ignore the ticket and proceed.
529 */
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200530 if( ( ret = ssl->conf->f_ticket_parse( ssl->conf->p_ticket, &session,
531 buf, len ) ) != 0 )
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200532 {
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200533 mbedtls_ssl_session_free( &session );
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200534
535 if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )
536 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is not authentic" ) );
537 else if( ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED )
538 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is expired" ) );
539 else
540 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_parse", ret );
541
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200542 return( 0 );
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200543 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200544
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200545 /*
546 * Keep the session ID sent by the client, since we MUST send it back to
547 * inform them we're accepting the ticket (RFC 5077 section 3.4)
548 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +0200549 session.id_len = ssl->session_negotiate->id_len;
550 memcpy( &session.id, ssl->session_negotiate->id, session.id_len );
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +0200551
552 mbedtls_ssl_session_free( ssl->session_negotiate );
553 memcpy( ssl->session_negotiate, &session, sizeof( mbedtls_ssl_session ) );
554
555 /* Zeroize instead of free as we copied the content */
556 mbedtls_zeroize( &session, sizeof( mbedtls_ssl_session ) );
557
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200558 MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from ticket" ) );
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200559
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200560 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200561
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200562 /* Don't send a new ticket after all, this one is OK */
563 ssl->handshake->new_session_ticket = 0;
564
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200565 return( 0 );
566}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200567#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200568
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200569#if defined(MBEDTLS_SSL_ALPN)
570static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard14beb082014-07-08 13:50:35 +0200571 const unsigned char *buf, size_t len )
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200572{
Paul Bakker14b16c62014-05-28 11:33:54 +0200573 size_t list_len, cur_len, ours_len;
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200574 const unsigned char *theirs, *start, *end;
575 const char **ours;
576
577 /* If ALPN not configured, just ignore the extension */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200578 if( ssl->conf->alpn_list == NULL )
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200579 return( 0 );
580
581 /*
582 * opaque ProtocolName<1..2^8-1>;
583 *
584 * struct {
585 * ProtocolName protocol_name_list<2..2^16-1>
586 * } ProtocolNameList;
587 */
588
589 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
590 if( len < 4 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200591 {
592 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
593 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200594 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200595 }
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200596
597 list_len = ( buf[0] << 8 ) | buf[1];
598 if( list_len != len - 2 )
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200599 {
600 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
601 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200602 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200603 }
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200604
605 /*
Manuel Pégourié-Gonnard239987f2018-01-09 10:43:43 +0100606 * Validate peer's list (lengths)
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200607 */
608 start = buf + 2;
609 end = buf + len;
Manuel Pégourié-Gonnard239987f2018-01-09 10:43:43 +0100610 for( theirs = start; theirs != end; theirs += cur_len )
611 {
612 cur_len = *theirs++;
613
614 /* Current identifier must fit in list */
615 if( cur_len > (size_t)( end - theirs ) )
616 {
617 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
618 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
619 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
620 }
621
622 /* Empty strings MUST NOT be included */
623 if( cur_len == 0 )
624 {
625 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
626 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
627 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
628 }
629 }
630
631 /*
632 * Use our order of preference
633 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200634 for( ours = ssl->conf->alpn_list; *ours != NULL; ours++ )
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200635 {
Paul Bakker14b16c62014-05-28 11:33:54 +0200636 ours_len = strlen( *ours );
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200637 for( theirs = start; theirs != end; theirs += cur_len )
638 {
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200639 cur_len = *theirs++;
640
Paul Bakker14b16c62014-05-28 11:33:54 +0200641 if( cur_len == ours_len &&
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200642 memcmp( theirs, *ours, cur_len ) == 0 )
643 {
644 ssl->alpn_chosen = *ours;
645 return( 0 );
646 }
647 }
648 }
649
650 /* If we get there, no match was found */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200651 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
652 MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL );
653 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200654}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200655#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +0200656
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100657/*
658 * Auxiliary functions for ServerHello parsing and related actions
659 */
660
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200661#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100662/*
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100663 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100664 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200665#if defined(MBEDTLS_ECDSA_C)
666static int ssl_check_key_curve( mbedtls_pk_context *pk,
667 const mbedtls_ecp_curve_info **curves )
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100668{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200669 const mbedtls_ecp_curve_info **crv = curves;
670 mbedtls_ecp_group_id grp_id = mbedtls_pk_ec( *pk )->grp.id;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100671
672 while( *crv != NULL )
673 {
674 if( (*crv)->grp_id == grp_id )
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100675 return( 0 );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100676 crv++;
677 }
678
Manuel Pégourié-Gonnard6458e3b2015-01-08 14:16:56 +0100679 return( -1 );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100680}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200681#endif /* MBEDTLS_ECDSA_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100682
683/*
684 * Try picking a certificate for this ciphersuite,
685 * return 0 on success and -1 on failure.
686 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200687static int ssl_pick_cert( mbedtls_ssl_context *ssl,
688 const mbedtls_ssl_ciphersuite_t * ciphersuite_info )
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100689{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200690 mbedtls_ssl_key_cert *cur, *list, *fallback = NULL;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +0100691 mbedtls_pk_type_t pk_alg =
692 mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +0200693 uint32_t flags;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100694
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200695#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100696 if( ssl->handshake->sni_key_cert != NULL )
697 list = ssl->handshake->sni_key_cert;
698 else
699#endif
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200700 list = ssl->conf->key_cert;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100701
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200702 if( pk_alg == MBEDTLS_PK_NONE )
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100703 return( 0 );
704
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200705 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite requires certificate" ) );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000706
Manuel Pégourié-Gonnarde540b492015-07-07 12:44:38 +0200707 if( list == NULL )
708 {
709 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server has no certificate" ) );
710 return( -1 );
711 }
712
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100713 for( cur = list; cur != NULL; cur = cur->next )
714 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200715 MBEDTLS_SSL_DEBUG_CRT( 3, "candidate certificate chain, certificate",
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000716 cur->cert );
717
Gilles Peskinee198df52018-01-05 21:17:45 +0100718 if( ! mbedtls_pk_can_do( &cur->cert->pk, pk_alg ) )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000719 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200720 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: key type" ) );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100721 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000722 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100723
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200724 /*
725 * This avoids sending the client a cert it'll reject based on
726 * keyUsage or other extensions.
727 *
728 * It also allows the user to provision different certificates for
729 * different uses based on keyUsage, eg if they want to avoid signing
730 * and decrypting with the same RSA key.
731 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200732 if( mbedtls_ssl_check_cert_usage( cur->cert, ciphersuite_info,
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +0100733 MBEDTLS_SSL_IS_SERVER, &flags ) != 0 )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200734 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200735 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: "
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000736 "(extended) key usage extension" ) );
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +0200737 continue;
738 }
739
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200740#if defined(MBEDTLS_ECDSA_C)
741 if( pk_alg == MBEDTLS_PK_ECDSA &&
Gilles Peskine81d4e892017-10-27 10:18:44 +0200742 ssl_check_key_curve( &cur->cert->pk, ssl->handshake->curves ) != 0 )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000743 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200744 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: elliptic curve" ) );
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100745 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000746 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100747#endif
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100748
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100749 /*
750 * Try to select a SHA-1 certificate for pre-1.2 clients, but still
751 * present them a SHA-higher cert rather than failing if it's the only
752 * one we got that satisfies the other conditions.
753 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200754 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 &&
755 cur->cert->sig_md != MBEDTLS_MD_SHA1 )
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100756 {
757 if( fallback == NULL )
758 fallback = cur;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000759 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200760 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate not preferred: "
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000761 "sha-2 with pre-TLS 1.2 client" ) );
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100762 continue;
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000763 }
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100764 }
765
Manuel Pégourié-Gonnard846ba472015-01-08 13:54:38 +0100766 /* If we get there, we got a winner */
767 break;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100768 }
769
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000770 if( cur == NULL )
771 cur = fallback;
772
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +0200773 /* Do not update ssl->handshake->key_cert unless there is a match */
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100774 if( cur != NULL )
775 {
776 ssl->handshake->key_cert = cur;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200777 MBEDTLS_SSL_DEBUG_CRT( 3, "selected certificate chain, certificate",
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000778 ssl->handshake->key_cert->cert );
Manuel Pégourié-Gonnarddf331a52015-01-08 16:43:07 +0100779 return( 0 );
780 }
781
782 return( -1 );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100783}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200784#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100785
786/*
787 * Check if a given ciphersuite is suitable for use with our config/keys/etc
788 * Sets ciphersuite_info only if the suite matches.
789 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200790static int ssl_ciphersuite_match( mbedtls_ssl_context *ssl, int suite_id,
791 const mbedtls_ssl_ciphersuite_t **ciphersuite_info )
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100792{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200793 const mbedtls_ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100794
Hanno Becker7e5437a2017-04-28 17:15:26 +0100795#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Hanno Becker4cb1f4d2017-10-10 15:59:57 +0100796 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +0100797 mbedtls_pk_type_t sig_type;
798#endif
799
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200800 suite_info = mbedtls_ssl_ciphersuite_from_id( suite_id );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100801 if( suite_info == NULL )
802 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200803 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
804 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100805 }
806
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200807 MBEDTLS_SSL_DEBUG_MSG( 3, ( "trying ciphersuite: %s", suite_info->name ) );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000808
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100809 if( suite_info->min_minor_ver > ssl->minor_ver ||
810 suite_info->max_minor_ver < ssl->minor_ver )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000811 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200812 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: version" ) );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100813 return( 0 );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000814 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100815
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200816#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200817 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200818 ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )
Manuel Pégourié-Gonnardd6664512014-02-06 13:26:57 +0100819 return( 0 );
820#endif
821
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +0200822#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200823 if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200824 suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000825 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200826 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: rc4" ) );
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +0100827 return( 0 );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000828 }
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +0200829#endif
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +0100830
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200831#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
832 if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200833 ( ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK ) == 0 )
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200834 {
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +0200835 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: ecjpake "
836 "not configured or ext missing" ) );
Manuel Pégourié-Gonnarde511b4e2015-09-16 14:11:09 +0200837 return( 0 );
838 }
839#endif
840
841
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200842#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
843 if( mbedtls_ssl_ciphersuite_uses_ec( suite_info ) &&
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100844 ( ssl->handshake->curves == NULL ||
845 ssl->handshake->curves[0] == NULL ) )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000846 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200847 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: "
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000848 "no common elliptic curve" ) );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100849 return( 0 );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000850 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100851#endif
852
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200853#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100854 /* If the ciphersuite requires a pre-shared key and we don't
855 * have one, skip it now rather than failing later */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200856 if( mbedtls_ssl_ciphersuite_uses_psk( suite_info ) &&
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200857 ssl->conf->f_psk == NULL &&
858 ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL ||
859 ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000860 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: no pre-shared key" ) );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100862 return( 0 );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000863 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100864#endif
865
Hanno Becker7e5437a2017-04-28 17:15:26 +0100866#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
867 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
868 /* If the ciphersuite requires signing, check whether
869 * a suitable hash algorithm is present. */
870 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
871 {
872 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg( suite_info );
873 if( sig_type != MBEDTLS_PK_NONE &&
874 mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, sig_type ) == MBEDTLS_MD_NONE )
875 {
876 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: no suitable hash algorithm "
877 "for signature algorithm %d", sig_type ) );
878 return( 0 );
879 }
880 }
881
882#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
883 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
884
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200885#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100886 /*
887 * Final check: if ciphersuite requires us to have a
888 * certificate/key of a particular type:
889 * - select the appropriate certificate if we have one, or
890 * - try the next ciphersuite if we don't
891 * This must be done last since we modify the key_cert list.
892 */
893 if( ssl_pick_cert( ssl, suite_info ) != 0 )
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000894 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200895 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: "
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000896 "no suitable certificate" ) );
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100897 return( 0 );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +0000898 }
Manuel Pégourié-Gonnard32525602013-11-30 17:50:32 +0100899#endif
900
901 *ciphersuite_info = suite_info;
902 return( 0 );
903}
904
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200905#if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
906static int ssl_parse_client_hello_v2( mbedtls_ssl_context *ssl )
Paul Bakker78a8c712013-03-06 17:01:52 +0100907{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +0100908 int ret, got_common_suite;
Paul Bakker78a8c712013-03-06 17:01:52 +0100909 unsigned int i, j;
910 size_t n;
911 unsigned int ciph_len, sess_len, chal_len;
912 unsigned char *buf, *p;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200913 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200914 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker78a8c712013-03-06 17:01:52 +0100915
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200916 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) );
Paul Bakker78a8c712013-03-06 17:01:52 +0100917
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200918#if defined(MBEDTLS_SSL_RENEGOTIATION)
919 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Paul Bakker78a8c712013-03-06 17:01:52 +0100920 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200921 MBEDTLS_SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +0200922 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
923 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200924 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +0100925 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200926#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker78a8c712013-03-06 17:01:52 +0100927
928 buf = ssl->in_hdr;
929
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200930 MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, 5 );
Paul Bakker78a8c712013-03-06 17:01:52 +0100931
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200932 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d",
Paul Bakker78a8c712013-03-06 17:01:52 +0100933 buf[2] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200934 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d",
Paul Bakker78a8c712013-03-06 17:01:52 +0100935 ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200936 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]",
Paul Bakker78a8c712013-03-06 17:01:52 +0100937 buf[3], buf[4] ) );
938
939 /*
940 * SSLv2 Client Hello
941 *
942 * Record layer:
943 * 0 . 1 message length
944 *
945 * SSL layer:
946 * 2 . 2 message type
947 * 3 . 4 protocol version
948 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200949 if( buf[2] != MBEDTLS_SSL_HS_CLIENT_HELLO ||
950 buf[3] != MBEDTLS_SSL_MAJOR_VERSION_3 )
Paul Bakker78a8c712013-03-06 17:01:52 +0100951 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200952 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
953 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +0100954 }
955
956 n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF;
957
958 if( n < 17 || n > 512 )
959 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200960 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
961 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +0100962 }
963
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200964 ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200965 ssl->minor_ver = ( buf[4] <= ssl->conf->max_minor_ver )
966 ? buf[4] : ssl->conf->max_minor_ver;
Paul Bakker78a8c712013-03-06 17:01:52 +0100967
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200968 if( ssl->minor_ver < ssl->conf->min_minor_ver )
Paul Bakker78a8c712013-03-06 17:01:52 +0100969 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200970 MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200971 " [%d:%d] < [%d:%d]",
972 ssl->major_ver, ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200973 ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) );
Paul Bakker78a8c712013-03-06 17:01:52 +0100974
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200975 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
976 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
977 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
Paul Bakker78a8c712013-03-06 17:01:52 +0100978 }
979
Paul Bakker2fbefde2013-06-29 16:01:15 +0200980 ssl->handshake->max_major_ver = buf[3];
981 ssl->handshake->max_minor_ver = buf[4];
Paul Bakker78a8c712013-03-06 17:01:52 +0100982
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200983 if( ( ret = mbedtls_ssl_fetch_input( ssl, 2 + n ) ) != 0 )
Paul Bakker78a8c712013-03-06 17:01:52 +0100984 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200985 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
Paul Bakker78a8c712013-03-06 17:01:52 +0100986 return( ret );
987 }
988
989 ssl->handshake->update_checksum( ssl, buf + 2, n );
990
991 buf = ssl->in_msg;
992 n = ssl->in_left - 5;
993
994 /*
995 * 0 . 1 ciphersuitelist length
996 * 2 . 3 session id length
997 * 4 . 5 challenge length
998 * 6 . .. ciphersuitelist
999 * .. . .. session id
1000 * .. . .. challenge
1001 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001002 MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, n );
Paul Bakker78a8c712013-03-06 17:01:52 +01001003
1004 ciph_len = ( buf[0] << 8 ) | buf[1];
1005 sess_len = ( buf[2] << 8 ) | buf[3];
1006 chal_len = ( buf[4] << 8 ) | buf[5];
1007
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001008 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d",
Paul Bakker78a8c712013-03-06 17:01:52 +01001009 ciph_len, sess_len, chal_len ) );
1010
1011 /*
1012 * Make sure each parameter length is valid
1013 */
1014 if( ciph_len < 3 || ( ciph_len % 3 ) != 0 )
1015 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001016 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1017 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001018 }
1019
1020 if( sess_len > 32 )
1021 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1023 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001024 }
1025
1026 if( chal_len < 8 || chal_len > 32 )
1027 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1029 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001030 }
1031
1032 if( n != 6 + ciph_len + sess_len + chal_len )
1033 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001034 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1035 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001036 }
1037
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001038 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
Paul Bakker78a8c712013-03-06 17:01:52 +01001039 buf + 6, ciph_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001040 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id",
Paul Bakker78a8c712013-03-06 17:01:52 +01001041 buf + 6 + ciph_len, sess_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001042 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, challenge",
Paul Bakker78a8c712013-03-06 17:01:52 +01001043 buf + 6 + ciph_len + sess_len, chal_len );
1044
1045 p = buf + 6 + ciph_len;
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001046 ssl->session_negotiate->id_len = sess_len;
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001047 memset( ssl->session_negotiate->id, 0,
1048 sizeof( ssl->session_negotiate->id ) );
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001049 memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->id_len );
Paul Bakker78a8c712013-03-06 17:01:52 +01001050
1051 p += sess_len;
1052 memset( ssl->handshake->randbytes, 0, 64 );
1053 memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len );
1054
1055 /*
1056 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1057 */
1058 for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )
1059 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001060 if( p[0] == 0 && p[1] == 0 && p[2] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO )
Paul Bakker78a8c712013-03-06 17:01:52 +01001061 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001062 MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
1063#if defined(MBEDTLS_SSL_RENEGOTIATION)
1064 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Paul Bakker78a8c712013-03-06 17:01:52 +01001065 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001066 MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV "
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001067 "during renegotiation" ) );
Paul Bakker78a8c712013-03-06 17:01:52 +01001068
Gilles Peskinec94f7352017-05-10 16:37:56 +02001069 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1070 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001071 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001072 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001073#endif /* MBEDTLS_SSL_RENEGOTIATION */
1074 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Paul Bakker78a8c712013-03-06 17:01:52 +01001075 break;
1076 }
1077 }
1078
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001079#if defined(MBEDTLS_SSL_FALLBACK_SCSV)
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001080 for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )
1081 {
1082 if( p[0] == 0 &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001083 p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) &&
1084 p[2] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) )
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001085 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001086 MBEDTLS_SSL_DEBUG_MSG( 3, ( "received FALLBACK_SCSV" ) );
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001087
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001088 if( ssl->minor_ver < ssl->conf->max_minor_ver )
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001089 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001090 MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) );
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001091
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001092 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1093 MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK );
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001094
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001095 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001096 }
1097
1098 break;
1099 }
1100 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001101#endif /* MBEDTLS_SSL_FALLBACK_SCSV */
Manuel Pégourié-Gonnard01b26992014-10-20 14:05:28 +02001102
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001103 got_common_suite = 0;
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001104 ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001105 ciphersuite_info = NULL;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001106#if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE)
Manuel Pégourié-Gonnard1a9f2c72013-11-30 18:30:06 +01001107 for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
Manuel Pégourié-Gonnard1a9f2c72013-11-30 18:30:06 +01001108 for( i = 0; ciphersuites[i] != 0; i++ )
1109#else
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001110 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker78a8c712013-03-06 17:01:52 +01001111 for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
Manuel Pégourié-Gonnard1a9f2c72013-11-30 18:30:06 +01001112#endif
Paul Bakker78a8c712013-03-06 17:01:52 +01001113 {
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001114 if( p[0] != 0 ||
1115 p[1] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) ||
1116 p[2] != ( ( ciphersuites[i] ) & 0xFF ) )
1117 continue;
Paul Bakker59c28a22013-06-29 15:33:42 +02001118
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001119 got_common_suite = 1;
1120
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001121 if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i],
1122 &ciphersuite_info ) ) != 0 )
1123 return( ret );
Paul Bakker59c28a22013-06-29 15:33:42 +02001124
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001125 if( ciphersuite_info != NULL )
Paul Bakker78a8c712013-03-06 17:01:52 +01001126 goto have_ciphersuite_v2;
1127 }
Paul Bakker78a8c712013-03-06 17:01:52 +01001128
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001129 if( got_common_suite )
1130 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001131 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, "
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001132 "but none of them usable" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001133 return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE );
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001134 }
1135 else
1136 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001137 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
1138 return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001139 }
Paul Bakker78a8c712013-03-06 17:01:52 +01001140
1141have_ciphersuite_v2:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001142 MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001143
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001144 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Paul Bakker59c28a22013-06-29 15:33:42 +02001145 ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
Paul Bakker78a8c712013-03-06 17:01:52 +01001146
1147 /*
1148 * SSLv2 Client Hello relevant renegotiation security checks
1149 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001150 if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001151 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker78a8c712013-03-06 17:01:52 +01001152 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001153 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001154 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1155 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001156 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker78a8c712013-03-06 17:01:52 +01001157 }
1158
1159 ssl->in_left = 0;
1160 ssl->state++;
1161
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001162 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) );
Paul Bakker78a8c712013-03-06 17:01:52 +01001163
1164 return( 0 );
1165}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001166#endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
Paul Bakker78a8c712013-03-06 17:01:52 +01001167
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001168/* This function doesn't alert on errors that happen early during
1169 ClientHello parsing because they might indicate that the client is
1170 not talking SSL/TLS at all and would not understand our alert. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001171static int ssl_parse_client_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001172{
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001173 int ret, got_common_suite;
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +02001174 size_t i, j;
1175 size_t ciph_offset, comp_offset, ext_offset;
1176 size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001177#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +02001178 size_t cookie_offset, cookie_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001179#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001180 unsigned char *buf, *p, *ext;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001181#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001182 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001183#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001184 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001185 const int *ciphersuites;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001186 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01001187 int major, minor;
Paul Bakker5121ce52009-01-03 21:22:43 +00001188
Hanno Becker7e5437a2017-04-28 17:15:26 +01001189 /* If there is no signature-algorithm extension present,
1190 * we need to fall back to the default values for allowed
1191 * signature-hash pairs. */
1192#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1193 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
1194 int sig_hash_alg_ext_present = 0;
1195#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
1196 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
1197
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001198 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001199
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001200#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001201read_record_header:
1202#endif
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001203 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001204 * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001205 * otherwise read it ourselves manually in order to support SSLv2
1206 * ClientHello, which doesn't use the same record layer format.
1207 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001208#if defined(MBEDTLS_SSL_RENEGOTIATION)
1209 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001210#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001211 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001212 if( ( ret = mbedtls_ssl_fetch_input( ssl, 5 ) ) != 0 )
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +00001213 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001214 /* No alert on a read error. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001215 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +00001216 return( ret );
1217 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001218 }
1219
1220 buf = ssl->in_hdr;
1221
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001222#if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
1223#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001224 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_STREAM )
Manuel Pégourié-Gonnard8a7cf252014-10-09 17:35:53 +02001225#endif
1226 if( ( buf[0] & 0x80 ) != 0 )
Gilles Peskinef9828522017-05-03 12:28:43 +02001227 return( ssl_parse_client_hello_v2( ssl ) );
Paul Bakker78a8c712013-03-06 17:01:52 +01001228#endif
1229
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001230 MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, mbedtls_ssl_hdr_len( ssl ) );
Paul Bakkerec636f32012-09-09 19:17:02 +00001231
Paul Bakkerec636f32012-09-09 19:17:02 +00001232 /*
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001233 * SSLv3/TLS Client Hello
Paul Bakkerec636f32012-09-09 19:17:02 +00001234 *
1235 * Record layer:
1236 * 0 . 0 message type
1237 * 1 . 2 protocol version
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001238 * 3 . 11 DTLS: epoch + record sequence number
Paul Bakkerec636f32012-09-09 19:17:02 +00001239 * 3 . 4 message length
1240 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001241 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d",
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001242 buf[0] ) );
1243
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001244 if( buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE )
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01001245 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001246 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1247 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01001248 }
1249
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001250 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d",
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001251 ( ssl->in_len[0] << 8 ) | ssl->in_len[1] ) );
1252
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001253 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, protocol version: [%d:%d]",
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001254 buf[1], buf[2] ) );
1255
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001256 mbedtls_ssl_read_version( &major, &minor, ssl->conf->transport, buf + 1 );
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001257
1258 /* According to RFC 5246 Appendix E.1, the version here is typically
1259 * "{03,00}, the lowest version number supported by the client, [or] the
1260 * value of ClientHello.client_version", so the only meaningful check here
1261 * is the major version shouldn't be less than 3 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001262 if( major < MBEDTLS_SSL_MAJOR_VERSION_3 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001263 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001264 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1265 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakkerec636f32012-09-09 19:17:02 +00001266 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001267
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001268 /* For DTLS if this is the initial handshake, remember the client sequence
1269 * number to use it in our next message (RFC 6347 4.2.1) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001270#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001271 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001272#if defined(MBEDTLS_SSL_RENEGOTIATION)
1273 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard3a173f42015-01-22 13:30:33 +00001274#endif
1275 )
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001276 {
1277 /* Epoch should be 0 for initial handshakes */
1278 if( ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0 )
1279 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001280 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1281 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001282 }
1283
1284 memcpy( ssl->out_ctr + 2, ssl->in_ctr + 2, 6 );
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001285
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001286#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
1287 if( mbedtls_ssl_dtls_replay_check( ssl ) != 0 )
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001288 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001289 MBEDTLS_SSL_DEBUG_MSG( 1, ( "replayed record, discarding" ) );
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001290 ssl->next_record_offset = 0;
1291 ssl->in_left = 0;
1292 goto read_record_header;
1293 }
1294
1295 /* No MAC to check yet, so we can update right now */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001296 mbedtls_ssl_dtls_replay_update( ssl );
Manuel Pégourié-Gonnardf03c7aa2014-09-24 14:54:06 +02001297#endif
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001298 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001299#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001300
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001301 msg_len = ( ssl->in_len[0] << 8 ) | ssl->in_len[1];
Paul Bakker5121ce52009-01-03 21:22:43 +00001302
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001303#if defined(MBEDTLS_SSL_RENEGOTIATION)
1304 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001305 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001306 /* Set by mbedtls_ssl_read_record() */
Manuel Pégourié-Gonnardb89c4f32015-01-21 13:24:10 +00001307 msg_len = ssl->in_hslen;
1308 }
1309 else
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001310#endif
Paul Bakkerec636f32012-09-09 19:17:02 +00001311 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001312 if( msg_len > MBEDTLS_SSL_MAX_CONTENT_LEN )
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001313 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001314 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1315 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001316 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001317
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01001318 if( ( ret = mbedtls_ssl_fetch_input( ssl,
1319 mbedtls_ssl_hdr_len( ssl ) + msg_len ) ) != 0 )
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001320 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001321 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001322 return( ret );
1323 }
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001324
1325 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001326#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001327 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001328 ssl->next_record_offset = msg_len + mbedtls_ssl_hdr_len( ssl );
Manuel Pégourié-Gonnard30d16eb2014-08-19 17:43:50 +02001329 else
1330#endif
1331 ssl->in_left = 0;
Manuel Pégourié-Gonnardd6b721c2014-03-24 12:13:54 +01001332 }
Paul Bakkerec636f32012-09-09 19:17:02 +00001333
1334 buf = ssl->in_msg;
Paul Bakkerec636f32012-09-09 19:17:02 +00001335
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001336 MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, msg_len );
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001337
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001338 ssl->handshake->update_checksum( ssl, buf, msg_len );
Paul Bakkerec636f32012-09-09 19:17:02 +00001339
1340 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001341 * Handshake layer:
1342 * 0 . 0 handshake type
1343 * 1 . 3 handshake length
1344 * 4 . 5 DTLS only: message seqence number
1345 * 6 . 8 DTLS only: fragment offset
1346 * 9 . 11 DTLS only: fragment length
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001347 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001348 if( msg_len < mbedtls_ssl_hs_hdr_len( ssl ) )
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001349 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001350 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1351 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001352 }
1353
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001354 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d", buf[0] ) );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001355
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001356 if( buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO )
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001357 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001358 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1359 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001360 }
1361
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001362 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d",
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001363 ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) );
1364
1365 /* We don't support fragmentation of ClientHello (yet?) */
1366 if( buf[1] != 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001367 msg_len != mbedtls_ssl_hs_hdr_len( ssl ) + ( ( buf[2] << 8 ) | buf[3] ) )
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001368 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001369 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1370 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001371 }
1372
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001373#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001374 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001375 {
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001376 /*
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001377 * Copy the client's handshake message_seq on initial handshakes,
1378 * check sequence number on renego.
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001379 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001380#if defined(MBEDTLS_SSL_RENEGOTIATION)
1381 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001382 {
1383 /* This couldn't be done in ssl_prepare_handshake_record() */
1384 unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) |
1385 ssl->in_msg[5];
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001386
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001387 if( cli_msg_seq != ssl->handshake->in_msg_seq )
1388 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001389 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message_seq: "
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001390 "%d (expected %d)", cli_msg_seq,
1391 ssl->handshake->in_msg_seq ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001392 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02001393 }
1394
1395 ssl->handshake->in_msg_seq++;
1396 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001397 else
1398#endif
1399 {
1400 unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) |
1401 ssl->in_msg[5];
1402 ssl->handshake->out_msg_seq = cli_msg_seq;
1403 ssl->handshake->in_msg_seq = cli_msg_seq + 1;
1404 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001405
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001406 /*
1407 * For now we don't support fragmentation, so make sure
1408 * fragment_offset == 0 and fragment_length == length
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001409 */
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001410 if( ssl->in_msg[6] != 0 || ssl->in_msg[7] != 0 || ssl->in_msg[8] != 0 ||
1411 memcmp( ssl->in_msg + 1, ssl->in_msg + 9, 3 ) != 0 )
1412 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001413 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ClientHello fragmentation not supported" ) );
1414 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01001415 }
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001416 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001417#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001418
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001419 buf += mbedtls_ssl_hs_hdr_len( ssl );
1420 msg_len -= mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001421
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01001422 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001423 * ClientHello layer:
1424 * 0 . 1 protocol version
1425 * 2 . 33 random bytes (starting with 4 bytes of Unix time)
1426 * 34 . 35 session id length (1 byte)
1427 * 35 . 34+x session id
1428 * 35+x . 35+x DTLS only: cookie length (1 byte)
1429 * 36+x . .. DTLS only: cookie
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001430 * .. . .. ciphersuite list length (2 bytes)
1431 * .. . .. ciphersuite list
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001432 * .. . .. compression alg. list length (1 byte)
1433 * .. . .. compression alg. list
1434 * .. . .. extensions length (2 bytes, optional)
1435 * .. . .. extensions (optional)
Paul Bakkerec636f32012-09-09 19:17:02 +00001436 */
Paul Bakkerec636f32012-09-09 19:17:02 +00001437
1438 /*
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001439 * Minimal length (with everything empty and extensions ommitted) is
1440 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1441 * read at least up to session id length without worrying.
Paul Bakkerec636f32012-09-09 19:17:02 +00001442 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001443 if( msg_len < 38 )
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001444 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001445 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1446 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001447 }
1448
1449 /*
1450 * Check and save the protocol version
1451 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001452 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, version", buf, 2 );
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001453
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001454 mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001455 ssl->conf->transport, buf );
Paul Bakkerec636f32012-09-09 19:17:02 +00001456
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001457 ssl->handshake->max_major_ver = ssl->major_ver;
1458 ssl->handshake->max_minor_ver = ssl->minor_ver;
1459
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001460 if( ssl->major_ver < ssl->conf->min_major_ver ||
1461 ssl->minor_ver < ssl->conf->min_minor_ver )
Paul Bakker1d29fb52012-09-28 13:28:45 +00001462 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001463 MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001464 " [%d:%d] < [%d:%d]",
1465 ssl->major_ver, ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001466 ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001467 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1468 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001469 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
Paul Bakker1d29fb52012-09-28 13:28:45 +00001470 }
1471
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001472 if( ssl->major_ver > ssl->conf->max_major_ver )
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001473 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001474 ssl->major_ver = ssl->conf->max_major_ver;
1475 ssl->minor_ver = ssl->conf->max_minor_ver;
Manuel Pégourié-Gonnard6b1e2072014-02-12 10:14:54 +01001476 }
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001477 else if( ssl->minor_ver > ssl->conf->max_minor_ver )
1478 ssl->minor_ver = ssl->conf->max_minor_ver;
Paul Bakkerec636f32012-09-09 19:17:02 +00001479
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001480 /*
1481 * Save client random (inc. Unix time)
1482 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001483 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 2, 32 );
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001484
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001485 memcpy( ssl->handshake->randbytes, buf + 2, 32 );
Paul Bakkerec636f32012-09-09 19:17:02 +00001486
1487 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001488 * Check the session ID length and save session ID
Paul Bakkerec636f32012-09-09 19:17:02 +00001489 */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001490 sess_len = buf[34];
Paul Bakkerec636f32012-09-09 19:17:02 +00001491
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001492 if( sess_len > sizeof( ssl->session_negotiate->id ) ||
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001493 sess_len + 34 + 2 > msg_len ) /* 2 for cipherlist length field */
Paul Bakkerec636f32012-09-09 19:17:02 +00001494 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001495 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001496 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1497 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001498 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakkerec636f32012-09-09 19:17:02 +00001499 }
1500
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001501 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 35, sess_len );
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001502
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001503 ssl->session_negotiate->id_len = sess_len;
Paul Bakker48916f92012-09-16 19:57:18 +00001504 memset( ssl->session_negotiate->id, 0,
1505 sizeof( ssl->session_negotiate->id ) );
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001506 memcpy( ssl->session_negotiate->id, buf + 35,
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001507 ssl->session_negotiate->id_len );
Paul Bakkerec636f32012-09-09 19:17:02 +00001508
1509 /*
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001510 * Check the cookie length and content
1511 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001512#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001513 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001514 {
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001515 cookie_offset = 35 + sess_len;
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001516 cookie_len = buf[cookie_offset];
1517
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001518 if( cookie_offset + 1 + cookie_len + 2 > msg_len )
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001519 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001520 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001521 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1522 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001523 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001524 }
1525
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001526 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001527 buf + cookie_offset + 1, cookie_len );
1528
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001529#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001530 if( ssl->conf->f_cookie_check != NULL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001531#if defined(MBEDTLS_SSL_RENEGOTIATION)
1532 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001533#endif
1534 )
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001535 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001536 if( ssl->conf->f_cookie_check( ssl->conf->p_cookie,
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001537 buf + cookie_offset + 1, cookie_len,
1538 ssl->cli_id, ssl->cli_id_len ) != 0 )
1539 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001540 MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification failed" ) );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001541 ssl->handshake->verify_cookie_len = 1;
1542 }
1543 else
1544 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001545 MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification passed" ) );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001546 ssl->handshake->verify_cookie_len = 0;
1547 }
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02001548 }
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02001549 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001550#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001551 {
1552 /* We know we didn't send a cookie, so it should be empty */
1553 if( cookie_len != 0 )
1554 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001555 /* This may be an attacker's probe, so don't send an alert */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001556 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1557 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001558 }
1559
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001560 MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification skipped" ) );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001561 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001562
1563 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001564 * Check the ciphersuitelist length (will be parsed later)
Paul Bakkerec636f32012-09-09 19:17:02 +00001565 */
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001566 ciph_offset = cookie_offset + 1 + cookie_len;
Manuel Pégourié-Gonnarda06d7fe2015-03-13 10:36:55 +00001567 }
Manuel Pégourié-Gonnard4128aa72014-03-21 09:40:12 +01001568 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001569#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard19d438f2014-09-09 17:08:52 +02001570 ciph_offset = 35 + sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +00001571
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001572 ciph_len = ( buf[ciph_offset + 0] << 8 )
1573 | ( buf[ciph_offset + 1] );
1574
1575 if( ciph_len < 2 ||
1576 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
1577 ( ciph_len % 2 ) != 0 )
Paul Bakkerec636f32012-09-09 19:17:02 +00001578 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001579 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001580 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1581 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001582 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakkerec636f32012-09-09 19:17:02 +00001583 }
1584
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001585 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001586 buf + ciph_offset + 2, ciph_len );
Paul Bakkerec636f32012-09-09 19:17:02 +00001587
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001588 /*
1589 * Check the compression algorithms length and pick one
1590 */
1591 comp_offset = ciph_offset + 2 + ciph_len;
1592
1593 comp_len = buf[comp_offset];
1594
1595 if( comp_len < 1 ||
1596 comp_len > 16 ||
1597 comp_len + comp_offset + 1 > msg_len )
Paul Bakkerec636f32012-09-09 19:17:02 +00001598 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001599 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001600 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1601 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001602 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakkerec636f32012-09-09 19:17:02 +00001603 }
1604
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001605 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, compression",
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001606 buf + comp_offset + 1, comp_len );
Paul Bakker48916f92012-09-16 19:57:18 +00001607
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001608 ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL;
1609#if defined(MBEDTLS_ZLIB_SUPPORT)
Paul Bakkerec636f32012-09-09 19:17:02 +00001610 for( i = 0; i < comp_len; ++i )
1611 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001612 if( buf[comp_offset + 1 + i] == MBEDTLS_SSL_COMPRESS_DEFLATE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001613 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001614 ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_DEFLATE;
Paul Bakkerec636f32012-09-09 19:17:02 +00001615 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001616 }
1617 }
Paul Bakker2770fbd2012-07-03 13:30:23 +00001618#endif
1619
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001620 /* See comments in ssl_write_client_hello() */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001621#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001622 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001623 ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001624#endif
Manuel Pégourié-Gonnard82202f02014-07-23 00:28:58 +02001625
Janos Follathc6dab2b2016-05-23 14:27:02 +01001626 /* Do not parse the extensions if the protocol is SSLv3 */
1627#if defined(MBEDTLS_SSL_PROTO_SSL3)
1628 if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) )
1629 {
1630#endif
Simon Butcher584a5472016-05-23 16:24:52 +01001631 /*
1632 * Check the extension length
1633 */
1634 ext_offset = comp_offset + 1 + comp_len;
1635 if( msg_len > ext_offset )
Paul Bakker48916f92012-09-16 19:57:18 +00001636 {
Simon Butcher584a5472016-05-23 16:24:52 +01001637 if( msg_len < ext_offset + 2 )
1638 {
1639 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001640 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1641 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Simon Butcher584a5472016-05-23 16:24:52 +01001642 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
1643 }
1644
1645 ext_len = ( buf[ext_offset + 0] << 8 )
1646 | ( buf[ext_offset + 1] );
1647
1648 if( ( ext_len > 0 && ext_len < 4 ) ||
1649 msg_len != ext_offset + 2 + ext_len )
1650 {
1651 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001652 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1653 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Simon Butcher584a5472016-05-23 16:24:52 +01001654 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
1655 }
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001656 }
Simon Butcher584a5472016-05-23 16:24:52 +01001657 else
1658 ext_len = 0;
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001659
Simon Butcher584a5472016-05-23 16:24:52 +01001660 ext = buf + ext_offset + 2;
1661 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello extensions", ext, ext_len );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001662
Simon Butcher584a5472016-05-23 16:24:52 +01001663 while( ext_len != 0 )
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001664 {
Simon Butcher584a5472016-05-23 16:24:52 +01001665 unsigned int ext_id = ( ( ext[0] << 8 )
1666 | ( ext[1] ) );
1667 unsigned int ext_size = ( ( ext[2] << 8 )
1668 | ( ext[3] ) );
Paul Bakker48916f92012-09-16 19:57:18 +00001669
Simon Butcher584a5472016-05-23 16:24:52 +01001670 if( ext_size + 4 > ext_len )
1671 {
1672 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001673 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1674 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Simon Butcher584a5472016-05-23 16:24:52 +01001675 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
1676 }
1677 switch( ext_id )
1678 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001679#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001680 case MBEDTLS_TLS_EXT_SERVERNAME:
1681 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
1682 if( ssl->conf->f_sni == NULL )
1683 break;
Paul Bakker5701cdc2012-09-27 21:49:42 +00001684
Simon Butcher584a5472016-05-23 16:24:52 +01001685 ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size );
1686 if( ret != 0 )
1687 return( ret );
1688 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001689#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00001690
Simon Butcher584a5472016-05-23 16:24:52 +01001691 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
1692 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001693#if defined(MBEDTLS_SSL_RENEGOTIATION)
Simon Butcher584a5472016-05-23 16:24:52 +01001694 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001695#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001696
Simon Butcher584a5472016-05-23 16:24:52 +01001697 ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size );
1698 if( ret != 0 )
1699 return( ret );
1700 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001701
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001702#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1703 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001704 case MBEDTLS_TLS_EXT_SIG_ALG:
Ron Eldor73a38172017-10-03 15:58:26 +03001705 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
1706
Simon Butcher584a5472016-05-23 16:24:52 +01001707 ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size );
1708 if( ret != 0 )
1709 return( ret );
Hanno Becker7e5437a2017-04-28 17:15:26 +01001710
1711 sig_hash_alg_ext_present = 1;
Simon Butcher584a5472016-05-23 16:24:52 +01001712 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001713#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
1714 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001715
Robert Cragie136884c2015-10-02 13:34:31 +01001716#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01001717 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001718 case MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
1719 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001720
Simon Butcher584a5472016-05-23 16:24:52 +01001721 ret = ssl_parse_supported_elliptic_curves( ssl, ext + 4, ext_size );
1722 if( ret != 0 )
1723 return( ret );
1724 break;
Paul Bakker41c83d32013-03-20 14:39:14 +01001725
Simon Butcher584a5472016-05-23 16:24:52 +01001726 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
1727 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported point formats extension" ) );
1728 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
Paul Bakker41c83d32013-03-20 14:39:14 +01001729
Simon Butcher584a5472016-05-23 16:24:52 +01001730 ret = ssl_parse_supported_point_formats( ssl, ext + 4, ext_size );
1731 if( ret != 0 )
1732 return( ret );
1733 break;
Robert Cragieae8535d2015-10-06 17:11:18 +01001734#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
1735 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001736
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001737#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Simon Butcher584a5472016-05-23 16:24:52 +01001738 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
1739 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake kkpp extension" ) );
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001740
Simon Butcher584a5472016-05-23 16:24:52 +01001741 ret = ssl_parse_ecjpake_kkpp( ssl, ext + 4, ext_size );
1742 if( ret != 0 )
1743 return( ret );
1744 break;
Manuel Pégourié-Gonnardbf57be62015-09-16 15:04:01 +02001745#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1746
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001747#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Simon Butcher584a5472016-05-23 16:24:52 +01001748 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
1749 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max fragment length extension" ) );
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001750
Simon Butcher584a5472016-05-23 16:24:52 +01001751 ret = ssl_parse_max_fragment_length_ext( ssl, ext + 4, ext_size );
1752 if( ret != 0 )
1753 return( ret );
1754 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001755#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001756
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001757#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001758 case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
1759 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001760
Simon Butcher584a5472016-05-23 16:24:52 +01001761 ret = ssl_parse_truncated_hmac_ext( ssl, ext + 4, ext_size );
1762 if( ret != 0 )
1763 return( ret );
1764 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001765#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001766
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001767#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Simon Butcher584a5472016-05-23 16:24:52 +01001768 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
1769 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt then mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001770
Simon Butcher584a5472016-05-23 16:24:52 +01001771 ret = ssl_parse_encrypt_then_mac_ext( ssl, ext + 4, ext_size );
1772 if( ret != 0 )
1773 return( ret );
1774 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001775#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001776
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001777#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Simon Butcher584a5472016-05-23 16:24:52 +01001778 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
1779 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended master secret extension" ) );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001780
Simon Butcher584a5472016-05-23 16:24:52 +01001781 ret = ssl_parse_extended_ms_ext( ssl, ext + 4, ext_size );
1782 if( ret != 0 )
1783 return( ret );
1784 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001785#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001786
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001787#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Simon Butcher584a5472016-05-23 16:24:52 +01001788 case MBEDTLS_TLS_EXT_SESSION_TICKET:
1789 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session ticket extension" ) );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001790
Simon Butcher584a5472016-05-23 16:24:52 +01001791 ret = ssl_parse_session_ticket_ext( ssl, ext + 4, ext_size );
1792 if( ret != 0 )
1793 return( ret );
1794 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001795#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001796
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001797#if defined(MBEDTLS_SSL_ALPN)
Simon Butcher584a5472016-05-23 16:24:52 +01001798 case MBEDTLS_TLS_EXT_ALPN:
1799 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001800
Simon Butcher584a5472016-05-23 16:24:52 +01001801 ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size );
1802 if( ret != 0 )
1803 return( ret );
1804 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001805#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02001806
Simon Butcher584a5472016-05-23 16:24:52 +01001807 default:
1808 MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
1809 ext_id ) );
1810 }
1811
1812 ext_len -= 4 + ext_size;
1813 ext += 4 + ext_size;
1814
1815 if( ext_len > 0 && ext_len < 4 )
1816 {
1817 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001818 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1819 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Simon Butcher584a5472016-05-23 16:24:52 +01001820 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
1821 }
Paul Bakker48916f92012-09-16 19:57:18 +00001822 }
Janos Follathc6dab2b2016-05-23 14:27:02 +01001823#if defined(MBEDTLS_SSL_PROTO_SSL3)
1824 }
1825#endif
1826
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001827#if defined(MBEDTLS_SSL_FALLBACK_SCSV)
Gilles Peskined50177f2017-05-16 17:53:03 +02001828 for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 )
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001829 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001830 if( p[0] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) &&
1831 p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) )
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001832 {
Manuel Pégourié-Gonnardcb0d2122015-07-22 11:52:11 +02001833 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received FALLBACK_SCSV" ) );
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001834
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001835 if( ssl->minor_ver < ssl->conf->max_minor_ver )
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001836 {
Manuel Pégourié-Gonnardcb0d2122015-07-22 11:52:11 +02001837 MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) );
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001838
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001839 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1840 MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK );
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001841
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001842 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001843 }
1844
1845 break;
1846 }
1847 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001848#endif /* MBEDTLS_SSL_FALLBACK_SCSV */
Manuel Pégourié-Gonnardfedba982014-11-05 16:12:09 +01001849
Hanno Becker7e5437a2017-04-28 17:15:26 +01001850#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1851 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
1852
1853 /*
1854 * Try to fall back to default hash SHA1 if the client
1855 * hasn't provided any preferred signature-hash combinations.
1856 */
1857 if( sig_hash_alg_ext_present == 0 )
1858 {
1859 mbedtls_md_type_t md_default = MBEDTLS_MD_SHA1;
1860
1861 if( mbedtls_ssl_check_sig_hash( ssl, md_default ) != 0 )
1862 md_default = MBEDTLS_MD_NONE;
1863
1864 mbedtls_ssl_sig_hash_set_const_hash( &ssl->handshake->hash_algs, md_default );
1865 }
1866
1867#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
1868 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
1869
Paul Bakker48916f92012-09-16 19:57:18 +00001870 /*
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001871 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1872 */
1873 for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 )
1874 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001875 if( p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO )
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001876 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001877 MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
1878#if defined(MBEDTLS_SSL_RENEGOTIATION)
1879 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001880 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01001881 MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV "
1882 "during renegotiation" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001883 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1884 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001885 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001886 }
Manuel Pégourié-Gonnard69849f82015-03-10 11:54:02 +00001887#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001888 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001889 break;
1890 }
1891 }
1892
1893 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001894 * Renegotiation security checks
1895 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001896 if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001897 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001898 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001899 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001900 handshake_failure = 1;
1901 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001902#if defined(MBEDTLS_SSL_RENEGOTIATION)
1903 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1904 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001905 renegotiation_info_seen == 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001906 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001907 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001908 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +00001909 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001910 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1911 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001912 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00001913 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001914 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001915 handshake_failure = 1;
1916 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001917 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1918 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001919 renegotiation_info_seen == 1 )
1920 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001921 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001922 handshake_failure = 1;
1923 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001924#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001925
1926 if( handshake_failure == 1 )
1927 {
Gilles Peskinec94f7352017-05-10 16:37:56 +02001928 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1929 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001930 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker48916f92012-09-16 19:57:18 +00001931 }
Paul Bakker380da532012-04-18 16:10:25 +00001932
Paul Bakker41c83d32013-03-20 14:39:14 +01001933 /*
1934 * Search for a matching ciphersuite
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02001935 * (At the end because we need information from the EC-based extensions
1936 * and certificate from the SNI callback triggered by the SNI extension.)
Paul Bakker41c83d32013-03-20 14:39:14 +01001937 */
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001938 got_common_suite = 0;
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001939 ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
Manuel Pégourié-Gonnard59b81d72013-11-30 17:46:04 +01001940 ciphersuite_info = NULL;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001941#if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE)
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001942 for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 )
Manuel Pégourié-Gonnard1a9f2c72013-11-30 18:30:06 +01001943 for( i = 0; ciphersuites[i] != 0; i++ )
1944#else
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001945 for( i = 0; ciphersuites[i] != 0; i++ )
Manuel Pégourié-Gonnard8933a652014-03-20 17:29:27 +01001946 for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 )
Manuel Pégourié-Gonnard1a9f2c72013-11-30 18:30:06 +01001947#endif
Paul Bakker41c83d32013-03-20 14:39:14 +01001948 {
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001949 if( p[0] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) ||
1950 p[1] != ( ( ciphersuites[i] ) & 0xFF ) )
1951 continue;
Paul Bakker41c83d32013-03-20 14:39:14 +01001952
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001953 got_common_suite = 1;
1954
Manuel Pégourié-Gonnard011a8db2013-11-30 18:11:07 +01001955 if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i],
1956 &ciphersuite_info ) ) != 0 )
1957 return( ret );
1958
1959 if( ciphersuite_info != NULL )
1960 goto have_ciphersuite;
Paul Bakker41c83d32013-03-20 14:39:14 +01001961 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001962
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001963 if( got_common_suite )
1964 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001965 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, "
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001966 "but none of them usable" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001967 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1968 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001969 return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE );
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001970 }
1971 else
1972 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001973 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
Gilles Peskinec94f7352017-05-10 16:37:56 +02001974 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1975 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001976 return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );
Manuel Pégourié-Gonnardf01768c2015-01-08 17:06:16 +01001977 }
Paul Bakker41c83d32013-03-20 14:39:14 +01001978
1979have_ciphersuite:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001980 MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) );
Manuel Pégourié-Gonnard607d6632015-01-26 11:17:20 +00001981
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001982 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Paul Bakker41c83d32013-03-20 14:39:14 +01001983 ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +01001984
Paul Bakker5121ce52009-01-03 21:22:43 +00001985 ssl->state++;
1986
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001987#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001988 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001989 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001990#endif
1991
Hanno Becker7e5437a2017-04-28 17:15:26 +01001992 /* Debugging-only output for testsuite */
1993#if defined(MBEDTLS_DEBUG_C) && \
1994 defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1995 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
1996 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
1997 {
1998 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg( ciphersuite_info );
1999 if( sig_alg != MBEDTLS_PK_NONE )
2000 {
2001 mbedtls_md_type_t md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs,
2002 sig_alg );
2003 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d",
2004 mbedtls_ssl_hash_from_md_alg( md_alg ) ) );
2005 }
2006 else
2007 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002008 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no hash algorithm for signature algorithm "
2009 "%d - should not happen", sig_alg ) );
Hanno Becker7e5437a2017-04-28 17:15:26 +01002010 }
2011 }
2012#endif
2013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002014 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002015
2016 return( 0 );
2017}
2018
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002019#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
2020static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002021 unsigned char *buf,
2022 size_t *olen )
2023{
2024 unsigned char *p = buf;
2025
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002026 if( ssl->session_negotiate->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002027 {
2028 *olen = 0;
2029 return;
2030 }
2031
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002032 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding truncated hmac extension" ) );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002034 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
2035 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002036
2037 *p++ = 0x00;
2038 *p++ = 0x00;
2039
2040 *olen = 4;
2041}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002042#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002043
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002044#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2045static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002046 unsigned char *buf,
2047 size_t *olen )
2048{
2049 unsigned char *p = buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002050 const mbedtls_ssl_ciphersuite_t *suite = NULL;
2051 const mbedtls_cipher_info_t *cipher = NULL;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002052
Hanno Becker27b34d52017-10-20 14:24:51 +01002053 if( ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002054 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002055 {
2056 *olen = 0;
2057 return;
2058 }
2059
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01002060 /*
2061 * RFC 7366: "If a server receives an encrypt-then-MAC request extension
2062 * from a client and then selects a stream or Authenticated Encryption
2063 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
2064 * encrypt-then-MAC response extension back to the client."
2065 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002066 if( ( suite = mbedtls_ssl_ciphersuite_from_id(
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01002067 ssl->session_negotiate->ciphersuite ) ) == NULL ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002068 ( cipher = mbedtls_cipher_info_from_type( suite->cipher ) ) == NULL ||
2069 cipher->mode != MBEDTLS_MODE_CBC )
Manuel Pégourié-Gonnard78e745f2014-11-04 15:44:06 +01002070 {
2071 *olen = 0;
2072 return;
2073 }
2074
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002075 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding encrypt then mac extension" ) );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002076
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002077 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
2078 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF );
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002079
2080 *p++ = 0x00;
2081 *p++ = 0x00;
2082
2083 *olen = 4;
2084}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002085#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002086
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002087#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2088static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002089 unsigned char *buf,
2090 size_t *olen )
2091{
2092 unsigned char *p = buf;
2093
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002094 if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
2095 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002096 {
2097 *olen = 0;
2098 return;
2099 }
2100
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002101 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding extended master secret "
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002102 "extension" ) );
2103
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002104 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );
2105 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF );
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002106
2107 *p++ = 0x00;
2108 *p++ = 0x00;
2109
2110 *olen = 4;
2111}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002112#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002114#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2115static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002116 unsigned char *buf,
2117 size_t *olen )
2118{
2119 unsigned char *p = buf;
2120
2121 if( ssl->handshake->new_session_ticket == 0 )
2122 {
2123 *olen = 0;
2124 return;
2125 }
2126
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002127 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding session ticket extension" ) );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002128
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002129 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
2130 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002131
2132 *p++ = 0x00;
2133 *p++ = 0x00;
2134
2135 *olen = 4;
2136}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002137#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002138
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002139static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002140 unsigned char *buf,
2141 size_t *olen )
2142{
2143 unsigned char *p = buf;
2144
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002145 if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION )
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002146 {
2147 *olen = 0;
2148 return;
2149 }
2150
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002151 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, secure renegotiation extension" ) );
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002152
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002153 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
2154 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002155
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002156#if defined(MBEDTLS_SSL_RENEGOTIATION)
2157 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002158 {
2159 *p++ = 0x00;
2160 *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF;
2161 *p++ = ssl->verify_data_len * 2 & 0xFF;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002162
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002163 memcpy( p, ssl->peer_verify_data, ssl->verify_data_len );
2164 p += ssl->verify_data_len;
2165 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
2166 p += ssl->verify_data_len;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002167 }
2168 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002169#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002170 {
2171 *p++ = 0x00;
2172 *p++ = 0x01;
2173 *p++ = 0x00;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002174 }
Manuel Pégourié-Gonnard19389752015-06-23 13:46:44 +02002175
2176 *olen = p - buf;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002177}
2178
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002179#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2180static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002181 unsigned char *buf,
2182 size_t *olen )
2183{
2184 unsigned char *p = buf;
2185
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002186 if( ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE )
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02002187 {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002188 *olen = 0;
2189 return;
2190 }
2191
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002192 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, max_fragment_length extension" ) );
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002193
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002194 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
2195 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002196
2197 *p++ = 0x00;
2198 *p++ = 1;
2199
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02002200 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002201
2202 *olen = 5;
2203}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002204#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002205
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +02002206#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02002207 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002208static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002209 unsigned char *buf,
2210 size_t *olen )
2211{
2212 unsigned char *p = buf;
2213 ((void) ssl);
2214
Paul Bakker677377f2013-10-28 12:54:26 +01002215 if( ( ssl->handshake->cli_exts &
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002216 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT ) == 0 )
Paul Bakker677377f2013-10-28 12:54:26 +01002217 {
2218 *olen = 0;
2219 return;
2220 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002221
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002222 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, supported_point_formats extension" ) );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002223
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002224 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
2225 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002226
2227 *p++ = 0x00;
2228 *p++ = 2;
2229
2230 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002231 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002232
2233 *olen = 6;
2234}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02002235#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002236
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002237#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2238static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
2239 unsigned char *buf,
2240 size_t *olen )
2241{
2242 int ret;
2243 unsigned char *p = buf;
Robert Cragie39a60de2015-10-02 13:57:59 +01002244 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002245 size_t kkpp_len;
2246
2247 *olen = 0;
2248
2249 /* Skip costly computation if not needed */
2250 if( ssl->transform_negotiate->ciphersuite_info->key_exchange !=
2251 MBEDTLS_KEY_EXCHANGE_ECJPAKE )
2252 return;
2253
2254 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, ecjpake kkpp extension" ) );
2255
2256 if( end - p < 4 )
2257 {
2258 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
2259 return;
2260 }
2261
2262 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
2263 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
2264
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02002265 ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
2266 p + 2, end - p - 2, &kkpp_len,
2267 ssl->conf->f_rng, ssl->conf->p_rng );
2268 if( ret != 0 )
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002269 {
2270 MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret );
2271 return;
2272 }
2273
2274 *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
2275 *p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
2276
2277 *olen = kkpp_len + 4;
2278}
2279#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2280
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002281#if defined(MBEDTLS_SSL_ALPN )
2282static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002283 unsigned char *buf, size_t *olen )
2284{
2285 if( ssl->alpn_chosen == NULL )
2286 {
2287 *olen = 0;
2288 return;
2289 }
2290
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002291 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding alpn extension" ) );
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002292
2293 /*
2294 * 0 . 1 ext identifier
2295 * 2 . 3 ext length
2296 * 4 . 5 protocol list length
2297 * 6 . 6 protocol name length
2298 * 7 . 7+n protocol name
2299 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002300 buf[0] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );
2301 buf[1] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF );
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002302
2303 *olen = 7 + strlen( ssl->alpn_chosen );
2304
2305 buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
2306 buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF );
2307
2308 buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
2309 buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF );
2310
2311 buf[6] = (unsigned char)( ( ( *olen - 7 ) ) & 0xFF );
2312
2313 memcpy( buf + 7, ssl->alpn_chosen, *olen - 7 );
2314}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002315#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002316
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002317#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
2318static int ssl_write_hello_verify_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002319{
2320 int ret;
2321 unsigned char *p = ssl->out_msg + 4;
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002322 unsigned char *cookie_len_byte;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002323
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002324 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello verify request" ) );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002325
2326 /*
2327 * struct {
2328 * ProtocolVersion server_version;
2329 * opaque cookie<0..2^8-1>;
2330 * } HelloVerifyRequest;
2331 */
2332
Manuel Pégourié-Gonnardb35fe562014-08-09 17:00:46 +02002333 /* The RFC is not clear on this point, but sending the actual negotiated
2334 * version looks like the most interoperable thing to do. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002335 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002336 ssl->conf->transport, p );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002337 MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002338 p += 2;
2339
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002340 /* If we get here, f_cookie_check is not null */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002341 if( ssl->conf->f_cookie_write == NULL )
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002342 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002343 MBEDTLS_SSL_DEBUG_MSG( 1, ( "inconsistent cookie callbacks" ) );
2344 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002345 }
2346
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002347 /* Skip length byte until we know the length */
2348 cookie_len_byte = p++;
2349
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002350 if( ( ret = ssl->conf->f_cookie_write( ssl->conf->p_cookie,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002351 &p, ssl->out_buf + MBEDTLS_SSL_BUFFER_LEN,
Manuel Pégourié-Gonnardd485d192014-07-23 14:56:15 +02002352 ssl->cli_id, ssl->cli_id_len ) ) != 0 )
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002353 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002354 MBEDTLS_SSL_DEBUG_RET( 1, "f_cookie_write", ret );
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002355 return( ret );
2356 }
2357
2358 *cookie_len_byte = (unsigned char)( p - ( cookie_len_byte + 1 ) );
2359
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002360 MBEDTLS_SSL_DEBUG_BUF( 3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002361
2362 ssl->out_msglen = p - ssl->out_msg;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002363 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2364 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002365
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002366 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002367
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002368 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002369 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002370 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002371 return( ret );
2372 }
2373
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002374 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello verify request" ) );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002375
2376 return( 0 );
2377}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002378#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002379
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002380static int ssl_write_server_hello( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002381{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002382#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002383 mbedtls_time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002384#endif
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002385 int ret;
2386 size_t olen, ext_len = 0, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002387 unsigned char *buf, *p;
2388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002389 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002390
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002391#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002392 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnardd7f9bc52014-07-23 11:09:27 +02002393 ssl->handshake->verify_cookie_len != 0 )
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002394 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002395 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client hello was not authenticated" ) );
2396 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002397
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02002398 return( ssl_write_hello_verify_request( ssl ) );
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002399 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002400#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
Manuel Pégourié-Gonnard2c9ee812014-07-22 11:45:03 +02002401
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002402 if( ssl->conf->f_rng == NULL )
Paul Bakkera9a028e2013-11-21 17:31:06 +01002403 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002404 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
2405 return( MBEDTLS_ERR_SSL_NO_RNG );
Paul Bakkera9a028e2013-11-21 17:31:06 +01002406 }
2407
Paul Bakker5121ce52009-01-03 21:22:43 +00002408 /*
2409 * 0 . 0 handshake type
2410 * 1 . 3 handshake length
2411 * 4 . 5 protocol version
2412 * 6 . 9 UNIX time()
2413 * 10 . 37 random bytes
2414 */
2415 buf = ssl->out_msg;
2416 p = buf + 4;
2417
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002418 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002419 ssl->conf->transport, p );
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002420 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002421
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002422 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01002423 buf[4], buf[5] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002424
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002425#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002426 t = mbedtls_time( NULL );
Paul Bakker5121ce52009-01-03 21:22:43 +00002427 *p++ = (unsigned char)( t >> 24 );
2428 *p++ = (unsigned char)( t >> 16 );
2429 *p++ = (unsigned char)( t >> 8 );
2430 *p++ = (unsigned char)( t );
2431
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002432 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002433#else
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002434 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )
Paul Bakkerfa9b1002013-07-03 15:31:03 +02002435 return( ret );
2436
2437 p += 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002438#endif /* MBEDTLS_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +00002439
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002440 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )
Paul Bakkera3d195c2011-11-27 21:07:34 +00002441 return( ret );
2442
2443 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +00002444
Paul Bakker48916f92012-09-16 19:57:18 +00002445 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002446
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002447 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002448
2449 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002450 * Resume is 0 by default, see ssl_handshake_init().
2451 * It may be already set to 1 by ssl_parse_session_ticket_ext().
2452 * If not, try looking up session ID in our cache.
Paul Bakker5121ce52009-01-03 21:22:43 +00002453 */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002454 if( ssl->handshake->resume == 0 &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002455#if defined(MBEDTLS_SSL_RENEGOTIATION)
2456 ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE &&
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002457#endif
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002458 ssl->session_negotiate->id_len != 0 &&
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002459 ssl->conf->f_get_cache != NULL &&
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01002460 ssl->conf->f_get_cache( ssl->conf->p_cache, ssl->session_negotiate ) == 0 )
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002461 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002462 MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from cache" ) );
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002463 ssl->handshake->resume = 1;
2464 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002465
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002466 if( ssl->handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002467 {
2468 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002469 * New session, create a new session id,
2470 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00002471 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002472 ssl->state++;
2473
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002474#if defined(MBEDTLS_HAVE_TIME)
SimonBd5800b72016-04-26 07:43:27 +01002475 ssl->session_negotiate->start = mbedtls_time( NULL );
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002476#endif
2477
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002478#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002479 if( ssl->handshake->new_session_ticket != 0 )
2480 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002481 ssl->session_negotiate->id_len = n = 0;
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02002482 memset( ssl->session_negotiate->id, 0, 32 );
2483 }
2484 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002485#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002486 {
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002487 ssl->session_negotiate->id_len = n = 32;
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002488 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id,
Paul Bakkera503a632013-08-14 13:48:06 +02002489 n ) ) != 0 )
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002490 return( ret );
2491 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002492 }
2493 else
2494 {
2495 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002496 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00002497 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002498 n = ssl->session_negotiate->id_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002499 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002500
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002501 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Paul Bakkerff60ee62010-03-16 21:09:09 +00002502 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002503 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Paul Bakkerff60ee62010-03-16 21:09:09 +00002504 return( ret );
2505 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002506 }
2507
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02002508 /*
2509 * 38 . 38 session id length
2510 * 39 . 38+n session id
2511 * 39+n . 40+n chosen ciphersuite
2512 * 41+n . 41+n chosen compression alg.
2513 * 42+n . 43+n extensions length
2514 * 44+n . 43+n+m extensions
2515 */
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02002516 *p++ = (unsigned char) ssl->session_negotiate->id_len;
2517 memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->id_len );
2518 p += ssl->session_negotiate->id_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002519
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002520 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
2521 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
2522 MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +00002523 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002524
Paul Bakker48916f92012-09-16 19:57:18 +00002525 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 );
2526 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite );
2527 *p++ = (unsigned char)( ssl->session_negotiate->compression );
Paul Bakker5121ce52009-01-03 21:22:43 +00002528
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002529 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s",
2530 mbedtls_ssl_get_ciphersuite_name( ssl->session_negotiate->ciphersuite ) ) );
2531 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: 0x%02X",
Paul Bakker48916f92012-09-16 19:57:18 +00002532 ssl->session_negotiate->compression ) );
2533
Janos Follathc6dab2b2016-05-23 14:27:02 +01002534 /* Do not write the extensions if the protocol is SSLv3 */
2535#if defined(MBEDTLS_SSL_PROTO_SSL3)
2536 if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) )
2537 {
2538#endif
2539
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02002540 /*
2541 * First write extensions, then the total length
2542 */
2543 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
2544 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00002545
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002546#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002547 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
2548 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +02002549#endif
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02002550
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002551#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002552 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
2553 ext_len += olen;
Paul Bakker1f2bc622013-08-15 13:45:55 +02002554#endif
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02002555
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002556#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002557 ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );
2558 ext_len += olen;
2559#endif
2560
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002561#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002562 ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );
2563 ext_len += olen;
2564#endif
2565
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002566#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002567 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
2568 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +02002569#endif
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002570
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +02002571#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +01002572 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02002573 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
2574 ext_len += olen;
2575#endif
2576
Manuel Pégourié-Gonnard55c7f992015-09-16 15:35:27 +02002577#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2578 ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );
2579 ext_len += olen;
2580#endif
2581
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002582#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard89e35792014-04-07 12:10:30 +02002583 ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
2584 ext_len += olen;
2585#endif
2586
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002587 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d", ext_len ) );
Paul Bakker48916f92012-09-16 19:57:18 +00002588
Paul Bakkera7036632014-04-30 10:15:38 +02002589 if( ext_len > 0 )
2590 {
2591 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
2592 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
2593 p += ext_len;
2594 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002595
Janos Follathc6dab2b2016-05-23 14:27:02 +01002596#if defined(MBEDTLS_SSL_PROTO_SSL3)
2597 }
2598#endif
2599
Paul Bakker5121ce52009-01-03 21:22:43 +00002600 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002601 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2602 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002603
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002604 ret = mbedtls_ssl_write_record( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00002605
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002606 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002607
2608 return( ret );
2609}
2610
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002611#if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
2612 !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
Paul Bakker29f221f2016-07-22 13:49:02 +01002613 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002614 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
Paul Bakker29f221f2016-07-22 13:49:02 +01002615 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002616 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
2617static int ssl_write_certificate_request( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002618{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002619 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2620 ssl->transform_negotiate->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002621
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002622 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002623
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002624 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2625 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
2626 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
Manuel Pégourié-Gonnard25dbeb02015-09-16 17:30:03 +02002627 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
2628 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002629 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002630 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002631 ssl->state++;
2632 return( 0 );
2633 }
2634
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002635 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2636 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002637}
2638#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002639static int ssl_write_certificate_request( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002640{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002641 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002642 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2643 ssl->transform_negotiate->ciphersuite_info;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002644 size_t dn_size, total_dn_size; /* excluding length bytes */
2645 size_t ct_len, sa_len; /* including length bytes */
Paul Bakker5121ce52009-01-03 21:22:43 +00002646 unsigned char *buf, *p;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002647 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002648 const mbedtls_x509_crt *crt;
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002649 int authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00002650
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002651 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002652
2653 ssl->state++;
2654
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002655#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2656 if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET )
2657 authmode = ssl->handshake->sni_authmode;
2658 else
2659#endif
2660 authmode = ssl->conf->authmode;
2661
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002662 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2663 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
2664 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2665 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
Manuel Pégourié-Gonnard25dbeb02015-09-16 17:30:03 +02002666 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002667 authmode == MBEDTLS_SSL_VERIFY_NONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002668 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002669 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002670 return( 0 );
2671 }
2672
2673 /*
2674 * 0 . 0 handshake type
2675 * 1 . 3 handshake length
2676 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01002677 * 5 .. m-1 cert types
2678 * m .. m+1 sig alg length (TLS 1.2 only)
Paul Bakker9af723c2014-05-01 13:03:14 +02002679 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002680 * n .. n+1 length of all DNs
2681 * n+2 .. n+3 length of DN 1
2682 * n+4 .. ... Distinguished Name #1
2683 * ... .. ... length of DN 2, etc.
2684 */
2685 buf = ssl->out_msg;
2686 p = buf + 4;
2687
2688 /*
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002689 * Supported certificate types
2690 *
2691 * ClientCertificateType certificate_types<1..2^8-1>;
2692 * enum { (255) } ClientCertificateType;
Paul Bakker5121ce52009-01-03 21:22:43 +00002693 */
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002694 ct_len = 0;
Paul Bakker926af752012-11-23 13:38:07 +01002695
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002696#if defined(MBEDTLS_RSA_C)
2697 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002698#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002699#if defined(MBEDTLS_ECDSA_C)
2700 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002701#endif
2702
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002703 p[0] = (unsigned char) ct_len++;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002704 p += ct_len;
Paul Bakker926af752012-11-23 13:38:07 +01002705
Paul Bakker577e0062013-08-28 11:57:20 +02002706 sa_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002707#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Paul Bakker926af752012-11-23 13:38:07 +01002708 /*
2709 * Add signature_algorithms for verify (TLS 1.2)
Paul Bakker926af752012-11-23 13:38:07 +01002710 *
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002711 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2712 *
2713 * struct {
2714 * HashAlgorithm hash;
2715 * SignatureAlgorithm signature;
2716 * } SignatureAndHashAlgorithm;
2717 *
2718 * enum { (255) } HashAlgorithm;
2719 * enum { (255) } SignatureAlgorithm;
Paul Bakker926af752012-11-23 13:38:07 +01002720 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002721 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01002722 {
Simon Butcher99000142016-10-13 17:21:01 +01002723 const int *cur;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002724
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002725 /*
2726 * Supported signature algorithms
2727 */
Simon Butcher99000142016-10-13 17:21:01 +01002728 for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ )
2729 {
2730 unsigned char hash = mbedtls_ssl_hash_from_md_alg( *cur );
2731
2732 if( MBEDTLS_SSL_HASH_NONE == hash || mbedtls_ssl_set_calc_verify_md( ssl, hash ) )
2733 continue;
2734
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002735#if defined(MBEDTLS_RSA_C)
Simon Butcher99000142016-10-13 17:21:01 +01002736 p[2 + sa_len++] = hash;
2737 p[2 + sa_len++] = MBEDTLS_SSL_SIG_RSA;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002738#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002739#if defined(MBEDTLS_ECDSA_C)
Simon Butcher99000142016-10-13 17:21:01 +01002740 p[2 + sa_len++] = hash;
2741 p[2 + sa_len++] = MBEDTLS_SSL_SIG_ECDSA;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002742#endif
Simon Butcher99000142016-10-13 17:21:01 +01002743 }
Paul Bakker926af752012-11-23 13:38:07 +01002744
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002745 p[0] = (unsigned char)( sa_len >> 8 );
2746 p[1] = (unsigned char)( sa_len );
2747 sa_len += 2;
2748 p += sa_len;
Paul Bakker926af752012-11-23 13:38:07 +01002749 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002750#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002751
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002752 /*
2753 * DistinguishedName certificate_authorities<0..2^16-1>;
2754 * opaque DistinguishedName<1..2^16-1>;
2755 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002756 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00002757
Paul Bakkerbc3d9842012-11-26 16:12:02 +01002758 total_dn_size = 0;
Janos Follath088ce432017-04-10 12:42:31 +01002759
2760 if( ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED )
Paul Bakker5121ce52009-01-03 21:22:43 +00002761 {
Janos Follath088ce432017-04-10 12:42:31 +01002762#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2763 if( ssl->handshake->sni_ca_chain != NULL )
2764 crt = ssl->handshake->sni_ca_chain;
2765 else
2766#endif
2767 crt = ssl->conf->ca_chain;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002768
Janos Follath088ce432017-04-10 12:42:31 +01002769 while( crt != NULL && crt->version != 0 )
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002770 {
Janos Follath088ce432017-04-10 12:42:31 +01002771 dn_size = crt->subject_raw.len;
2772
2773 if( end < p ||
2774 (size_t)( end - p ) < dn_size ||
2775 (size_t)( end - p ) < 2 + dn_size )
2776 {
2777 MBEDTLS_SSL_DEBUG_MSG( 1, ( "skipping CAs: buffer too short" ) );
2778 break;
2779 }
2780
2781 *p++ = (unsigned char)( dn_size >> 8 );
2782 *p++ = (unsigned char)( dn_size );
2783 memcpy( p, crt->subject_raw.p, dn_size );
2784 p += dn_size;
2785
2786 MBEDTLS_SSL_DEBUG_BUF( 3, "requested DN", p - dn_size, dn_size );
2787
2788 total_dn_size += 2 + dn_size;
2789 crt = crt->next;
Manuel Pégourié-Gonnardbc1babb2015-10-02 11:16:47 +02002790 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002791 }
2792
Paul Bakker926af752012-11-23 13:38:07 +01002793 ssl->out_msglen = p - buf;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002794 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2795 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02002796 ssl->out_msg[4 + ct_len + sa_len] = (unsigned char)( total_dn_size >> 8 );
2797 ssl->out_msg[5 + ct_len + sa_len] = (unsigned char)( total_dn_size );
Paul Bakker5121ce52009-01-03 21:22:43 +00002798
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002799 ret = mbedtls_ssl_write_record( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00002800
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002801 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002802
2803 return( ret );
2804}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002805#endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
2806 !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
Paul Bakker29f221f2016-07-22 13:49:02 +01002807 !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002808 !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
Paul Bakker29f221f2016-07-22 13:49:02 +01002809 !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002810 !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002811
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002812#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2813 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2814static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002815{
2816 int ret;
2817
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002818 if( ! mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECKEY ) )
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002819 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002820 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
2821 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002822 }
2823
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002824 if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx,
2825 mbedtls_pk_ec( *mbedtls_ssl_own_key( ssl ) ),
2826 MBEDTLS_ECDH_OURS ) ) != 0 )
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002827 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002828 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002829 return( ret );
2830 }
2831
2832 return( 0 );
2833}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002834#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2835 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard55389702013-12-12 11:14:16 +01002836
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002837#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002838 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002839static int ssl_resume_server_key_exchange( mbedtls_ssl_context *ssl,
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002840 size_t *signature_len )
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002841{
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002842 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2843 * signature length which will be added in ssl_write_server_key_exchange
2844 * after the call to ssl_prepare_server_key_exchange.
2845 * ssl_write_server_key_exchange also takes care of incrementing
2846 * ssl->out_msglen. */
2847 unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002848 size_t sig_max_len = ( ssl->out_buf + MBEDTLS_SSL_MAX_CONTENT_LEN
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002849 - sig_start );
Gilles Peskine8f97af72018-04-26 11:46:10 +02002850 int ret = ssl->conf->f_async_resume( ssl,
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02002851 sig_start, signature_len, sig_max_len );
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002852 if( ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS )
2853 {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002854 ssl->handshake->async_in_progress = 0;
2855 mbedtls_ssl_async_set_data( ssl, NULL );
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002856 }
Gilles Peskined3eb0612018-01-08 17:07:44 +01002857 MBEDTLS_SSL_DEBUG_RET( 2, "ssl_resume_server_key_exchange", ret );
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002858 return( ret );
2859}
2860#endif /* defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002861 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01002862
Gilles Peskined3eb0612018-01-08 17:07:44 +01002863/* Prepare the ServerKeyExchange message, up to and including
Gilles Peskine168dae82018-04-25 23:35:42 +02002864 * calculating the signature if any, but excluding formatting the
2865 * signature and sending the message. */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01002866static int ssl_prepare_server_key_exchange( mbedtls_ssl_context *ssl,
2867 size_t *signature_len )
Paul Bakker41c83d32013-03-20 14:39:14 +01002868{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002869 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002870 ssl->transform_negotiate->ciphersuite_info;
Gilles Peskinefe1c0932017-11-23 13:35:02 +01002871#if defined(MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED)
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002872#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)
Gilles Peskine3ce9b902018-01-06 01:34:21 +01002873 unsigned char *dig_signed = NULL;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002874#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */
2875#endif /* MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED */
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002876
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002877 (void) ciphersuite_info; /* unused in some configurations */
Gilles Peskine22e695f2018-04-26 00:22:50 +02002878#if !defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)
2879 (void) signature_len;
2880#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002881
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002882 ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
2883
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002884 /*
2885 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002886 * Part 1: Provide key exchange parameters for chosen ciphersuite.
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002887 *
2888 */
2889
2890 /*
2891 * - ECJPAKE key exchanges
2892 */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002893#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2894 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
2895 {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002896 int ret;
Gilles Peskined3eb0612018-01-08 17:07:44 +01002897 size_t len;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002898
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002899 ret = mbedtls_ecjpake_write_round_two(
2900 &ssl->handshake->ecjpake_ctx,
2901 ssl->out_msg + ssl->out_msglen,
2902 MBEDTLS_SSL_MAX_CONTENT_LEN - ssl->out_msglen, &len,
2903 ssl->conf->f_rng, ssl->conf->p_rng );
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002904 if( ret != 0 )
2905 {
2906 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
2907 return( ret );
2908 }
2909
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002910 ssl->out_msglen += len;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002911 }
2912#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2913
Hanno Becker1aa267c2017-04-28 17:08:27 +01002914 /*
2915 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2916 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2917 * we use empty support identity hints here.
2918 **/
2919#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002920 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2921 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2922 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002923 {
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002924 ssl->out_msg[ssl->out_msglen++] = 0x00;
2925 ssl->out_msg[ssl->out_msglen++] = 0x00;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002926 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002927#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2928 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002929
Hanno Becker7e5437a2017-04-28 17:15:26 +01002930 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002931 * - DHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002932 */
2933#if defined(MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED)
2934 if( mbedtls_ssl_ciphersuite_uses_dhe( ciphersuite_info ) )
Paul Bakker48916f92012-09-16 19:57:18 +00002935 {
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002936 int ret;
Gilles Peskined3eb0612018-01-08 17:07:44 +01002937 size_t len;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01002938
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002939 if( ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL )
2940 {
2941 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no DH parameters set" ) );
2942 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2943 }
2944
Paul Bakker41c83d32013-03-20 14:39:14 +01002945 /*
2946 * Ephemeral DH parameters:
2947 *
2948 * struct {
2949 * opaque dh_p<1..2^16-1>;
2950 * opaque dh_g<1..2^16-1>;
2951 * opaque dh_Ys<1..2^16-1>;
2952 * } ServerDHParams;
2953 */
Hanno Beckerab740562017-10-04 13:15:37 +01002954 if( ( ret = mbedtls_dhm_set_group( &ssl->handshake->dhm_ctx,
2955 &ssl->conf->dhm_P,
2956 &ssl->conf->dhm_G ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01002957 {
Hanno Beckerab740562017-10-04 13:15:37 +01002958 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_set_group", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01002959 return( ret );
2960 }
Paul Bakker48916f92012-09-16 19:57:18 +00002961
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002962 if( ( ret = mbedtls_dhm_make_params(
2963 &ssl->handshake->dhm_ctx,
2964 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
2965 ssl->out_msg + ssl->out_msglen, &len,
2966 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01002967 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002968 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_params", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01002969 return( ret );
2970 }
2971
Hanno Becker4cb1f4d2017-10-10 15:59:57 +01002972#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002973 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002974#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002975
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01002976 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002977
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002978 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
2979 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
2980 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
2981 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker41c83d32013-03-20 14:39:14 +01002982 }
Hanno Becker1aa267c2017-04-28 17:08:27 +01002983#endif /* MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002984
Hanno Becker1aa267c2017-04-28 17:08:27 +01002985 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01002986 * - ECDHE key exchanges
Hanno Becker1aa267c2017-04-28 17:08:27 +01002987 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002988#if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED)
Hanno Becker1aa267c2017-04-28 17:08:27 +01002989 if( mbedtls_ssl_ciphersuite_uses_ecdhe( ciphersuite_info ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002990 {
Paul Bakker41c83d32013-03-20 14:39:14 +01002991 /*
2992 * Ephemeral ECDH parameters:
2993 *
2994 * struct {
2995 * ECParameters curve_params;
2996 * ECPoint public;
2997 * } ServerECDHParams;
2998 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002999 const mbedtls_ecp_curve_info **curve = NULL;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003000 const mbedtls_ecp_group_id *gid;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003001 int ret;
Gilles Peskined3eb0612018-01-08 17:07:44 +01003002 size_t len;
Gergely Budai987bfb52014-01-19 21:48:42 +01003003
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01003004 /* Match our preference list against the offered curves */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003005 for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ )
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01003006 for( curve = ssl->handshake->curves; *curve != NULL; curve++ )
3007 if( (*curve)->grp_id == *gid )
3008 goto curve_matching_done;
3009
3010curve_matching_done:
Manuel Pégourié-Gonnardb86145e2015-06-23 14:11:39 +02003011 if( curve == NULL || *curve == NULL )
Gergely Budai987bfb52014-01-19 21:48:42 +01003012 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003013 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no matching curve for ECDHE" ) );
3014 return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );
Gergely Budai987bfb52014-01-19 21:48:42 +01003015 }
Manuel Pégourié-Gonnardde053902014-02-04 13:58:39 +01003016
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003017 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDHE curve: %s", (*curve)->name ) );
Gergely Budai987bfb52014-01-19 21:48:42 +01003018
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +02003019 if( ( ret = mbedtls_ecp_group_load( &ssl->handshake->ecdh_ctx.grp,
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01003020 (*curve)->grp_id ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003021 {
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +02003022 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecp_group_load", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01003023 return( ret );
3024 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003025
Gilles Peskinefe1c0932017-11-23 13:35:02 +01003026 if( ( ret = mbedtls_ecdh_make_params(
3027 &ssl->handshake->ecdh_ctx, &len,
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003028 ssl->out_msg + ssl->out_msglen,
3029 MBEDTLS_SSL_MAX_CONTENT_LEN - ssl->out_msglen,
Gilles Peskinefe1c0932017-11-23 13:35:02 +01003030 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003031 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003032 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_params", ret );
Paul Bakker41c83d32013-03-20 14:39:14 +01003033 return( ret );
3034 }
3035
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003036#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003037 dig_signed = ssl->out_msg + ssl->out_msglen;
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003038#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003039
Gilles Peskinef9f15ae2018-01-08 17:13:01 +01003040 ssl->out_msglen += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003041
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003042 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q ", &ssl->handshake->ecdh_ctx.Q );
Paul Bakker41c83d32013-03-20 14:39:14 +01003043 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003044#endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003045
Hanno Becker1aa267c2017-04-28 17:08:27 +01003046 /*
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003047 *
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003048 * Part 2: For key exchanges involving the server signing the
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003049 * exchange parameters, compute and add the signature here.
3050 *
Hanno Becker1aa267c2017-04-28 17:08:27 +01003051 */
3052#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)
3053 if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003054 {
Gilles Peskine1004c192018-01-08 16:59:14 +01003055 size_t dig_signed_len = ssl->out_msg + ssl->out_msglen - dig_signed;
Gilles Peskineca1d7422018-04-24 11:53:22 +02003056 size_t hashlen = 0;
Gilles Peskinee1efdf92018-01-05 21:18:37 +01003057 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003058 int ret;
Paul Bakker23f36802012-09-28 14:15:14 +00003059
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003060 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003061 * 2.1: Choose hash algorithm:
Hanno Becker4cb1f4d2017-10-10 15:59:57 +01003062 * A: For TLS 1.2, obey signature-hash-algorithm extension
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003063 * to choose appropriate hash.
3064 * B: For SSL3, TLS1.0, TLS1.1 and ECDHE_ECDSA, use SHA1
3065 * (RFC 4492, Sec. 5.4)
3066 * C: Otherwise, use MD5 + SHA1 (RFC 4346, Sec. 7.4.3)
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003067 */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003068
3069 mbedtls_md_type_t md_alg;
3070
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003071#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003072 mbedtls_pk_type_t sig_alg =
3073 mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003074 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003075 {
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003076 /* A: For TLS 1.2, obey signature-hash-algorithm extension
3077 * (RFC 5246, Sec. 7.4.1.4.1). */
Hanno Becker7e5437a2017-04-28 17:15:26 +01003078 if( sig_alg == MBEDTLS_PK_NONE ||
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003079 ( md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs,
3080 sig_alg ) ) == MBEDTLS_MD_NONE )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003081 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003082 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Hanno Becker4cb1f4d2017-10-10 15:59:57 +01003083 /* (... because we choose a cipher suite
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003084 * only if there is a matching hash.) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003085 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003086 }
3087 }
Paul Bakker577e0062013-08-28 11:57:20 +02003088 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003089#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3090#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3091 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003092 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003093 {
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003094 /* B: Default hash SHA1 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003095 md_alg = MBEDTLS_MD_SHA1;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003096 }
3097 else
Hanno Becker1aa267c2017-04-28 17:08:27 +01003098#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
3099 MBEDTLS_SSL_PROTO_TLS1_1 */
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003100 {
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003101 /* C: MD5 + SHA1 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003102 md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003103 }
3104
Hanno Becker7e5437a2017-04-28 17:15:26 +01003105 MBEDTLS_SSL_DEBUG_MSG( 3, ( "pick hash algorithm %d for signing", md_alg ) );
3106
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003107 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003108 * 2.2: Compute the hash to be signed
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003109 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003110#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3111 defined(MBEDTLS_SSL_PROTO_TLS1_1)
3112 if( md_alg == MBEDTLS_MD_NONE )
Paul Bakker23f36802012-09-28 14:15:14 +00003113 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003114 hashlen = 36;
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01003115 ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash,
3116 dig_signed,
3117 dig_signed_len );
3118 if( ret != 0 )
3119 return( ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003120 }
3121 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003122#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
3123 MBEDTLS_SSL_PROTO_TLS1_1 */
3124#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
3125 defined(MBEDTLS_SSL_PROTO_TLS1_2)
3126 if( md_alg != MBEDTLS_MD_NONE )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003127 {
Gilles Peskineca1d7422018-04-24 11:53:22 +02003128 ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, &hashlen,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01003129 dig_signed,
3130 dig_signed_len,
3131 md_alg );
3132 if( ret != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003133 return( ret );
Paul Bakker23f36802012-09-28 14:15:14 +00003134 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003135 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003136#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
3137 MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02003138 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003139 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3140 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02003141 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02003142
Gilles Peskineebd652f2018-01-05 21:18:59 +01003143 MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003144
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003145 /*
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003146 * 2.3: Compute and add the signature
Manuel Pégourié-Gonnardabae74c2013-08-20 13:53:44 +02003147 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003148#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3149 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker23f36802012-09-28 14:15:14 +00003150 {
Hanno Beckercf7ae7e2017-05-11 14:07:25 +01003151 /*
3152 * For TLS 1.2, we need to specify signature and hash algorithm
Hanno Becker7e5437a2017-04-28 17:15:26 +01003153 * explicitly through a prefix to the signature.
3154 *
3155 * struct {
3156 * HashAlgorithm hash;
3157 * SignatureAlgorithm signature;
3158 * } SignatureAndHashAlgorithm;
3159 *
3160 * struct {
3161 * SignatureAndHashAlgorithm algorithm;
3162 * opaque signature<0..2^16-1>;
3163 * } DigitallySigned;
3164 *
3165 */
3166
Gilles Peskine1004c192018-01-08 16:59:14 +01003167 ssl->out_msg[ssl->out_msglen++] =
3168 mbedtls_ssl_hash_from_md_alg( md_alg );
3169 ssl->out_msg[ssl->out_msglen++] =
3170 mbedtls_ssl_sig_from_pk_alg( sig_alg );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003171 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003172#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003173
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003174#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003175 if( ssl->conf->f_async_sign_start != NULL )
3176 {
Gilles Peskine8f97af72018-04-26 11:46:10 +02003177 ret = ssl->conf->f_async_sign_start( ssl,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003178 mbedtls_ssl_own_cert( ssl ),
3179 md_alg, hash, hashlen );
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003180 switch( ret )
3181 {
3182 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3183 /* act as if f_async_sign was null */
3184 break;
3185 case 0:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003186 ssl->handshake->async_in_progress = 1;
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003187 return( ssl_resume_server_key_exchange( ssl, signature_len ) );
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003188 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003189 ssl->handshake->async_in_progress = 1;
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003190 return( MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS );
3191 default:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003192 MBEDTLS_SSL_DEBUG_RET( 1, "f_async_sign_start", ret );
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003193 return( ret );
3194 }
3195 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003196#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine4bf9a282018-01-05 21:20:50 +01003197
3198 if( mbedtls_ssl_own_key( ssl ) == NULL )
3199 {
3200 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key" ) );
3201 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
3202 }
3203
Gilles Peskine0fd90dd2018-04-26 07:41:09 +02003204 /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3205 * signature length which will be added in ssl_write_server_key_exchange
3206 * after the call to ssl_prepare_server_key_exchange.
3207 * ssl_write_server_key_exchange also takes care of incrementing
3208 * ssl->out_msglen. */
Gilles Peskine1004c192018-01-08 16:59:14 +01003209 if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ),
3210 md_alg, hash, hashlen,
3211 ssl->out_msg + ssl->out_msglen + 2,
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003212 signature_len,
Gilles Peskine1004c192018-01-08 16:59:14 +01003213 ssl->conf->f_rng,
3214 ssl->conf->p_rng ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003215 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003216 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02003217 return( ret );
Paul Bakker23f36802012-09-28 14:15:14 +00003218 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00003219 }
Hanno Becker1aa267c2017-04-28 17:08:27 +01003220#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003221
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003222 return( 0 );
3223}
3224
Gilles Peskined3eb0612018-01-08 17:07:44 +01003225/* Prepare the ServerKeyExchange message and send it. For ciphersuites
Gilles Peskine168dae82018-04-25 23:35:42 +02003226 * that do not include a ServerKeyExchange message, do nothing. Either
3227 * way, if successful, move on to the next step in the SSL state
3228 * machine. */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003229static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl )
3230{
3231 int ret;
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003232 size_t signature_len = 0;
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003233#if defined(MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED)
3234 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3235 ssl->transform_negotiate->ciphersuite_info;
Gilles Peskinef1127252018-04-24 13:05:39 +02003236#endif /* MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003237
Gilles Peskined3eb0612018-01-08 17:07:44 +01003238 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
3239
3240#if defined(MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED)
3241 /* Extract static ECDH parameters and abort if ServerKeyExchange
3242 * is not needed. */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003243 if( mbedtls_ssl_ciphersuite_no_pfs( ciphersuite_info ) )
3244 {
3245 /* For suites involving ECDH, extract DH parameters
3246 * from certificate at this point. */
3247#if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED)
3248 if( mbedtls_ssl_ciphersuite_uses_ecdh( ciphersuite_info ) )
3249 {
3250 ssl_get_ecdh_params_from_cert( ssl );
3251 }
3252#endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED */
3253
3254 /* Key exchanges not involving ephemeral keys don't use
3255 * ServerKeyExchange, so end here. */
3256 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
3257 ssl->state++;
3258 return( 0 );
3259 }
Gilles Peskinef1127252018-04-24 13:05:39 +02003260#endif /* MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED */
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003261
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003262#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) && \
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003263 defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskined3eb0612018-01-08 17:07:44 +01003264 /* If we have already prepared the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003265 * signature operation, resume signing. */
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003266 if( ssl->handshake->async_in_progress != 0 )
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003267 {
3268 MBEDTLS_SSL_DEBUG_MSG( 2, ( "resuming signature operation" ) );
3269 ret = ssl_resume_server_key_exchange( ssl, &signature_len );
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003270 }
3271 else
3272#endif /* defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) &&
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003273 defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003274 {
3275 /* ServerKeyExchange is needed. Prepare the message. */
3276 ret = ssl_prepare_server_key_exchange( ssl, &signature_len );
Gilles Peskined3eb0612018-01-08 17:07:44 +01003277 }
3278
3279 if( ret != 0 )
3280 {
Gilles Peskinead28bf02018-04-26 00:19:16 +02003281 /* If we're starting to write a new message, set ssl->out_msglen
3282 * to 0. But if we're resuming after an asynchronous message,
3283 * out_msglen is the amount of data written so far and mst be
3284 * preserved. */
Gilles Peskined3eb0612018-01-08 17:07:44 +01003285 if( ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS )
3286 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server key exchange (pending)" ) );
3287 else
3288 ssl->out_msglen = 0;
3289 return( ret );
Gilles Peskineebd30ae2018-01-06 03:34:20 +01003290 }
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003291
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003292 /* If there is a signature, write its length.
Gilles Peskine168dae82018-04-25 23:35:42 +02003293 * ssl_prepare_server_key_exchange already wrote the signature
3294 * itself at its proper place in the output buffer. */
Gilles Peskine7ab013a2018-01-08 17:04:16 +01003295#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)
3296 if( signature_len != 0 )
3297 {
3298 ssl->out_msg[ssl->out_msglen++] = (unsigned char)( signature_len >> 8 );
3299 ssl->out_msg[ssl->out_msglen++] = (unsigned char)( signature_len );
3300
3301 MBEDTLS_SSL_DEBUG_BUF( 3, "my signature",
3302 ssl->out_msg + ssl->out_msglen,
3303 signature_len );
3304
3305 /* Skip over the already-written signature */
3306 ssl->out_msglen += signature_len;
3307 }
3308#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */
3309
Gilles Peskine184a3fa2018-01-06 01:46:17 +01003310 /* Add header and send. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003311 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3312 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003313
3314 ssl->state++;
3315
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003316 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003317 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003318 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003319 return( ret );
3320 }
3321
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003322 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003323 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003324}
3325
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003326static int ssl_write_server_hello_done( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003327{
3328 int ret;
3329
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003330 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003331
3332 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003333 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3334 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003335
3336 ssl->state++;
3337
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003338#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003339 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003340 mbedtls_ssl_send_flight_completed( ssl );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003341#endif
3342
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003343 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003344 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003345 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003346 return( ret );
3347 }
3348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003349 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003350
3351 return( 0 );
3352}
3353
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003354#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
3355 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3356static int ssl_parse_client_dh_public( mbedtls_ssl_context *ssl, unsigned char **p,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003357 const unsigned char *end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003358{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003359 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003360 size_t n;
3361
3362 /*
3363 * Receive G^Y mod P, premaster = (G^Y)^X mod P
3364 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003365 if( *p + 2 > end )
3366 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003367 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3368 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003369 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02003370
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003371 n = ( (*p)[0] << 8 ) | (*p)[1];
3372 *p += 2;
3373
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003374 if( *p + n > end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003375 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003376 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3377 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003378 }
3379
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003380 if( ( ret = mbedtls_dhm_read_public( &ssl->handshake->dhm_ctx, *p, n ) ) != 0 )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003381 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003382 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_read_public", ret );
3383 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003384 }
3385
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003386 *p += n;
3387
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003388 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003389
Paul Bakker70df2fb2013-04-17 17:19:09 +02003390 return( ret );
3391}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003392#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3393 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003394
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003395#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3396 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003397
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003398#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003399static int ssl_resume_decrypt_pms( mbedtls_ssl_context *ssl,
3400 unsigned char *peer_pms,
3401 size_t *peer_pmslen,
3402 size_t peer_pmssize )
3403{
Gilles Peskine8f97af72018-04-26 11:46:10 +02003404 int ret = ssl->conf->f_async_resume( ssl,
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003405 peer_pms, peer_pmslen, peer_pmssize );
3406 if( ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS )
3407 {
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003408 ssl->handshake->async_in_progress = 0;
3409 mbedtls_ssl_async_set_data( ssl, NULL );
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003410 }
3411 MBEDTLS_SSL_DEBUG_RET( 2, "ssl_decrypt_encrypted_pms", ret );
3412 return( ret );
3413}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003414#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003415
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003416static int ssl_decrypt_encrypted_pms( mbedtls_ssl_context *ssl,
3417 const unsigned char *p,
3418 const unsigned char *end,
3419 unsigned char *peer_pms,
3420 size_t *peer_pmslen,
3421 size_t peer_pmssize )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003422{
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003423 int ret;
Gilles Peskine422ccab2018-01-11 18:29:01 +01003424 mbedtls_pk_context *private_key = mbedtls_ssl_own_key( ssl );
3425 mbedtls_pk_context *public_key = &mbedtls_ssl_own_cert( ssl )->pk;
3426 size_t len = mbedtls_pk_get_len( public_key );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003427
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003428#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003429 /* If we have already started decoding the message and there is an ongoing
Gilles Peskine168dae82018-04-25 23:35:42 +02003430 * decryption operation, resume signing. */
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003431 if( ssl->handshake->async_in_progress != 0 )
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003432 {
3433 MBEDTLS_SSL_DEBUG_MSG( 2, ( "resuming decryption operation" ) );
3434 return( ssl_resume_decrypt_pms( ssl,
3435 peer_pms, peer_pmslen, peer_pmssize ) );
3436 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003437#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003438
Paul Bakker70df2fb2013-04-17 17:19:09 +02003439 /*
Gilles Peskine422ccab2018-01-11 18:29:01 +01003440 * Prepare to decrypt the premaster using own private RSA key
Paul Bakker70df2fb2013-04-17 17:19:09 +02003441 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003442#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
3443 defined(MBEDTLS_SSL_PROTO_TLS1_2)
3444 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003445 {
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003446 if( *p++ != ( ( len >> 8 ) & 0xFF ) ||
3447 *p++ != ( ( len ) & 0xFF ) )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003448 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003449 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3450 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003451 }
3452 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003453#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003454
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003455 if( p + len != end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003456 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003457 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3458 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003459 }
3460
Gilles Peskine422ccab2018-01-11 18:29:01 +01003461 /*
3462 * Decrypt the premaster secret
3463 */
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003464#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003465 if( ssl->conf->f_async_decrypt_start != NULL )
3466 {
Gilles Peskine8f97af72018-04-26 11:46:10 +02003467 ret = ssl->conf->f_async_decrypt_start( ssl,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003468 mbedtls_ssl_own_cert( ssl ),
3469 p, len );
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003470 switch( ret )
3471 {
3472 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3473 /* act as if f_async_decrypt_start was null */
3474 break;
3475 case 0:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003476 ssl->handshake->async_in_progress = 1;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003477 return( ssl_resume_decrypt_pms( ssl,
3478 peer_pms,
3479 peer_pmslen,
3480 peer_pmssize ) );
3481 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003482 ssl->handshake->async_in_progress = 1;
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003483 return( MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS );
3484 default:
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003485 MBEDTLS_SSL_DEBUG_RET( 1, "f_async_decrypt_start", ret );
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003486 return( ret );
3487 }
3488 }
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003489#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003490
Gilles Peskine422ccab2018-01-11 18:29:01 +01003491 if( ! mbedtls_pk_can_do( private_key, MBEDTLS_PK_RSA ) )
3492 {
Gilles Peskine422ccab2018-01-11 18:29:01 +01003493 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no RSA private key" ) );
3494 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
3495 }
3496
3497 ret = mbedtls_pk_decrypt( private_key, p, len,
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003498 peer_pms, peer_pmslen, peer_pmssize,
3499 ssl->conf->f_rng, ssl->conf->p_rng );
3500 return( ret );
3501}
3502
3503static int ssl_parse_encrypted_pms( mbedtls_ssl_context *ssl,
3504 const unsigned char *p,
3505 const unsigned char *end,
3506 size_t pms_offset )
3507{
3508 int ret;
3509 unsigned char *pms = ssl->handshake->premaster + pms_offset;
3510 unsigned char ver[2];
3511 unsigned char fake_pms[48], peer_pms[48];
3512 unsigned char mask;
3513 size_t i, peer_pmslen;
3514 unsigned int diff;
3515
3516 ret = ssl_decrypt_encrypted_pms( ssl, p, end,
3517 peer_pms,
3518 &peer_pmslen,
3519 sizeof( peer_pms ) );
3520
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003521#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003522 if ( ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS )
3523 return( ret );
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003524#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003525
Gilles Peskine2e333372018-04-24 13:22:10 +02003526 mbedtls_ssl_write_version( ssl->handshake->max_major_ver,
3527 ssl->handshake->max_minor_ver,
3528 ssl->conf->transport, ver );
3529
3530 /* Avoid data-dependent branches while checking for invalid
3531 * padding, to protect against timing-based Bleichenbacher-type
3532 * attacks. */
3533 diff = (unsigned int) ret;
3534 diff |= peer_pmslen ^ 48;
3535 diff |= peer_pms[0] ^ ver[0];
3536 diff |= peer_pms[1] ^ ver[1];
3537
3538 /* mask = diff ? 0xff : 0x00 using bit operations to avoid branches */
3539 /* MSVC has a warning about unary minus on unsigned, but this is
3540 * well-defined and precisely what we want to do here */
3541#if defined(_MSC_VER)
3542#pragma warning( push )
3543#pragma warning( disable : 4146 )
3544#endif
3545 mask = - ( ( diff | - diff ) >> ( sizeof( unsigned int ) * 8 - 1 ) );
3546#if defined(_MSC_VER)
3547#pragma warning( pop )
3548#endif
3549
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003550 /*
3551 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3552 * must not cause the connection to end immediately; instead, send a
3553 * bad_record_mac later in the handshake.
3554 * To protect against timing-based variants of the attack, we must
3555 * not have any branch that depends on whether the decryption was
3556 * successful. In particular, always generate the fake premaster secret,
3557 * regardless of whether it will ultimately influence the output or not.
3558 */
3559 ret = ssl->conf->f_rng( ssl->conf->p_rng, fake_pms, sizeof( fake_pms ) );
3560 if( ret != 0 )
3561 {
Gilles Peskinee1416382018-04-26 10:23:21 +02003562 /* It's ok to abort on an RNG failure, since this does not reveal
3563 * anything about the RSA decryption. */
Gilles Peskinebcd98a52018-01-11 21:30:40 +01003564 return( ret );
3565 }
3566
Manuel Pégourié-Gonnard331ba572015-04-20 12:33:57 +01003567#if defined(MBEDTLS_SSL_DEBUG_ALL)
Manuel Pégourié-Gonnardce60fbe2015-04-15 16:45:52 +02003568 if( diff != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003569 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003570#endif
Paul Bakker70df2fb2013-04-17 17:19:09 +02003571
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003572 if( sizeof( ssl->handshake->premaster ) < pms_offset ||
3573 sizeof( ssl->handshake->premaster ) - pms_offset < 48 )
3574 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003575 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3576 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003577 }
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003578 ssl->handshake->pmslen = 48;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003579
Gilles Peskine422ccab2018-01-11 18:29:01 +01003580 /* Set pms to either the true or the fake PMS, without
3581 * data-dependent branches. */
Manuel Pégourié-Gonnard6674cce2015-02-06 10:30:58 +00003582 for( i = 0; i < ssl->handshake->pmslen; i++ )
3583 pms[i] = ( mask & fake_pms[i] ) | ( (~mask) & peer_pms[i] );
3584
3585 return( 0 );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003586}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003587#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
3588 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02003589
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003590#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
3591static int ssl_parse_client_psk_identity( mbedtls_ssl_context *ssl, unsigned char **p,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003592 const unsigned char *end )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003593{
Paul Bakker6db455e2013-09-18 17:29:31 +02003594 int ret = 0;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003595 size_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003596
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003597 if( ssl->conf->f_psk == NULL &&
3598 ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL ||
3599 ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003600 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003601 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) );
3602 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakkerfbb17802013-04-17 19:10:21 +02003603 }
3604
3605 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003606 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02003607 */
Hanno Becker83c9f492017-06-26 13:52:14 +01003608 if( end - *p < 2 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003609 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003610 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3611 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003612 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003613
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003614 n = ( (*p)[0] << 8 ) | (*p)[1];
3615 *p += 2;
3616
Hanno Becker83c9f492017-06-26 13:52:14 +01003617 if( n < 1 || n > 65535 || n > (size_t) ( end - *p ) )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003618 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003619 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3620 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakkerfbb17802013-04-17 19:10:21 +02003621 }
3622
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003623 if( ssl->conf->f_psk != NULL )
Paul Bakker6db455e2013-09-18 17:29:31 +02003624 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003625 if( ssl->conf->f_psk( ssl->conf->p_psk, ssl, *p, n ) != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003626 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003627 }
Manuel Pégourié-Gonnardd27680b2014-07-08 14:15:55 +02003628 else
Paul Bakker6db455e2013-09-18 17:29:31 +02003629 {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +01003630 /* Identity is not a big secret since clients send it in the clear,
3631 * but treat it carefully anyway, just in case */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003632 if( n != ssl->conf->psk_identity_len ||
3633 mbedtls_ssl_safer_memcmp( ssl->conf->psk_identity, *p, n ) != 0 )
Paul Bakker6db455e2013-09-18 17:29:31 +02003634 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003635 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
Paul Bakker6db455e2013-09-18 17:29:31 +02003636 }
3637 }
3638
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003639 if( ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003640 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003641 MBEDTLS_SSL_DEBUG_BUF( 3, "Unknown PSK identity", *p, n );
Gilles Peskinec94f7352017-05-10 16:37:56 +02003642 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3643 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003644 return( MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY );
Paul Bakkerfbb17802013-04-17 19:10:21 +02003645 }
3646
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003647 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02003648
Manuel Pégourié-Gonnardd27680b2014-07-08 14:15:55 +02003649 return( 0 );
Paul Bakkerfbb17802013-04-17 19:10:21 +02003650}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003651#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02003652
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003653static int ssl_parse_client_key_exchange( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003654{
Paul Bakker23986e52011-04-24 08:57:21 +00003655 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003656 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003657 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02003658
Paul Bakker41c83d32013-03-20 14:39:14 +01003659 ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003660
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003661 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003662
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003663#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003664 ( defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3665 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) )
3666 if( ( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3667 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ) &&
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003668 ( ssl->handshake->async_in_progress != 0 ) )
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003669 {
3670 /* We've already read a record and there is an asynchronous
3671 * operation in progress to decrypt it. So skip reading the
Gilles Peskine168dae82018-04-25 23:35:42 +02003672 * record. */
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003673 MBEDTLS_SSL_DEBUG_MSG( 3, ( "will resume decryption of previously-read record" ) );
3674 }
3675 else
3676#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003677 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003678 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003679 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003680 return( ret );
3681 }
3682
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003683 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003684 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnardf8995832014-09-10 08:25:12 +00003685
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003686 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003687 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003688 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3689 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003690 }
3691
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003692 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003693 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003694 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
3695 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003696 }
3697
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003698#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
3699 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003700 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003701 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003702 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003703 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003704 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003705 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003706
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003707 if( p != end )
3708 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003709 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
3710 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003711 }
3712
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003713 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003714 ssl->handshake->premaster,
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +01003715 MBEDTLS_PREMASTER_SIZE,
Manuel Pégourié-Gonnard2d627642013-09-04 14:22:07 +02003716 &ssl->handshake->pmslen,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003717 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003718 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003719 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
3720 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003721 }
3722
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003723 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003724 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003725 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003726#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
3727#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
3728 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
3729 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
3730 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
3731 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3732 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3733 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
3734 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
Paul Bakker70df2fb2013-04-17 17:19:09 +02003735 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003736 if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx,
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003737 p, end - p) ) != 0 )
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003738 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003739 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret );
3740 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003741 }
3742
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003743 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Qp ", &ssl->handshake->ecdh_ctx.Qp );
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003744
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003745 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003746 &ssl->handshake->pmslen,
3747 ssl->handshake->premaster,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003748 MBEDTLS_MPI_MAX_SIZE,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01003749 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003750 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003751 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
3752 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003753 }
3754
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003755 MBEDTLS_SSL_DEBUG_MPI( 3, "ECDH: z ", &ssl->handshake->ecdh_ctx.z );
Paul Bakker5121ce52009-01-03 21:22:43 +00003756 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003757 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003758#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3759 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3760 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3761 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3762#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
3763 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003764 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003765 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
Paul Bakkerfbb17802013-04-17 19:10:21 +02003766 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003767 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
Paul Bakkerfbb17802013-04-17 19:10:21 +02003768 return( ret );
3769 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003770
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003771 if( p != end )
3772 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003773 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
3774 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003775 }
3776
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003777 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003778 ciphersuite_info->key_exchange ) ) != 0 )
3779 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003780 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003781 return( ret );
3782 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02003783 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003784 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003785#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
3786#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
3787 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003788 {
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003789#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003790 if ( ssl->handshake->async_in_progress != 0 )
Gilles Peskine2c6078e2018-01-12 13:46:43 +01003791 {
3792 /* There is an asynchronous operation in progress to
3793 * decrypt the encrypted premaster secret, so skip
3794 * directly to resuming this operation. */
3795 MBEDTLS_SSL_DEBUG_MSG( 3, ( "PSK identity already parsed" ) );
3796 /* Update p to skip the PSK identity. ssl_parse_encrypted_pms
3797 * won't actually use it, but maintain p anyway for robustness. */
3798 p += ssl->conf->psk_identity_len + 2;
3799 }
3800 else
Gilles Peskineb74a1c72018-04-24 13:09:22 +02003801#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003802 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
3803 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003804 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003805 return( ret );
3806 }
3807
3808 if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 2 ) ) != 0 )
3809 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003810 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_encrypted_pms" ), ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003811 return( ret );
3812 }
3813
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003814 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003815 ciphersuite_info->key_exchange ) ) != 0 )
3816 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003817 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003818 return( ret );
3819 }
3820 }
3821 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003822#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3823#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3824 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003825 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003826 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
3827 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003828 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003829 return( ret );
3830 }
3831 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
3832 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003833 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003834 return( ret );
3835 }
3836
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003837 if( p != end )
3838 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003839 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
3840 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Manuel Pégourié-Gonnard969ccc62014-03-26 19:53:25 +01003841 }
3842
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003843 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003844 ciphersuite_info->key_exchange ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003845 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003846 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003847 return( ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003848 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003849 }
3850 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003851#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
3852#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
3853 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003854 {
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003855 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
3856 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003857 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003858 return( ret );
3859 }
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003860
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003861 if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx,
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003862 p, end - p ) ) != 0 )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003863 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003864 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret );
3865 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003866 }
3867
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003868 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Qp ", &ssl->handshake->ecdh_ctx.Qp );
Manuel Pégourié-Gonnardb59d6992013-10-14 12:00:45 +02003869
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003870 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02003871 ciphersuite_info->key_exchange ) ) != 0 )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003872 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003873 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003874 return( ret );
3875 }
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003876 }
3877 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003878#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
3879#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
3880 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01003881 {
Manuel Pégourié-Gonnard2114d722014-09-10 13:59:41 +00003882 if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 0 ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01003883 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003884 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_parse_encrypted_pms_secret" ), ret );
Paul Bakker70df2fb2013-04-17 17:19:09 +02003885 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003886 }
3887 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003888 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003889#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003890#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
3891 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
3892 {
3893 ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
3894 p, end - p );
3895 if( ret != 0 )
3896 {
3897 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
3898 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
3899 }
3900
3901 ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
3902 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
3903 ssl->conf->f_rng, ssl->conf->p_rng );
3904 if( ret != 0 )
3905 {
3906 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
3907 return( ret );
3908 }
3909 }
3910 else
3911#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003912 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003913 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3914 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003915 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003916
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003917 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
Paul Bakkerff60ee62010-03-16 21:09:09 +00003918 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003919 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
Paul Bakkerff60ee62010-03-16 21:09:09 +00003920 return( ret );
3921 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003922
Paul Bakker5121ce52009-01-03 21:22:43 +00003923 ssl->state++;
3924
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003925 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003926
3927 return( 0 );
3928}
3929
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003930#if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
3931 !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
Paul Bakker29f221f2016-07-22 13:49:02 +01003932 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003933 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
Paul Bakker29f221f2016-07-22 13:49:02 +01003934 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003935 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
3936static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003937{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003938 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3939 ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00003940
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003941 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003942
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003943 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
3944 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3945 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
Manuel Pégourié-Gonnard25dbeb02015-09-16 17:30:03 +02003946 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
3947 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Paul Bakkered27a042013-04-18 22:46:23 +02003948 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003949 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
Paul Bakkered27a042013-04-18 22:46:23 +02003950 ssl->state++;
3951 return( 0 );
3952 }
3953
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003954 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3955 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003956}
3957#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003958static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003959{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003960 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00003961 size_t i, sig_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003962 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003963 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02003964 size_t hashlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003965#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3966 mbedtls_pk_type_t pk_alg;
Paul Bakker577e0062013-08-28 11:57:20 +02003967#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003968 mbedtls_md_type_t md_alg;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003969 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3970 ssl->transform_negotiate->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003971
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003972 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003973
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003974 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
3975 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3976 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
3977 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
Manuel Pégourié-Gonnard25dbeb02015-09-16 17:30:03 +02003978 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
Manuel Pégourié-Gonnard72226212014-09-10 14:23:38 +00003979 ssl->session_negotiate->peer_cert == NULL )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003980 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003981 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003982 ssl->state++;
3983 return( 0 );
3984 }
3985
Simon Butcher99000142016-10-13 17:21:01 +01003986 /* Read the message without adding it to the checksum */
3987 do {
Paul Bakker5121ce52009-01-03 21:22:43 +00003988
Hanno Becker90333da2017-10-10 11:27:13 +01003989 do ret = mbedtls_ssl_read_record_layer( ssl );
3990 while( ret == MBEDTLS_ERR_SSL_CONTINUE_PROCESSING );
3991
3992 if( ret != 0 )
Simon Butcher99000142016-10-13 17:21:01 +01003993 {
3994 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_read_record_layer" ), ret );
3995 return( ret );
3996 }
3997
3998 ret = mbedtls_ssl_handle_message_type( ssl );
3999
Hanno Becker90333da2017-10-10 11:27:13 +01004000 } while( MBEDTLS_ERR_SSL_NON_FATAL == ret ||
4001 MBEDTLS_ERR_SSL_CONTINUE_PROCESSING == ret );
Simon Butcher99000142016-10-13 17:21:01 +01004002
4003 if( 0 != ret )
Paul Bakker5121ce52009-01-03 21:22:43 +00004004 {
Simon Butcher99000142016-10-13 17:21:01 +01004005 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_handle_message_type" ), ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004006 return( ret );
4007 }
4008
4009 ssl->state++;
4010
Simon Butcher99000142016-10-13 17:21:01 +01004011 /* Process the message contents */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004012 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4013 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00004014 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004015 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
4016 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00004017 }
4018
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004019 i = mbedtls_ssl_hs_hdr_len( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00004020
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004021 /*
4022 * struct {
4023 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4024 * opaque signature<0..2^16-1>;
4025 * } DigitallySigned;
4026 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004027#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
4028 defined(MBEDTLS_SSL_PROTO_TLS1_1)
4029 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01004030 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004031 md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004032 hashlen = 36;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004033
4034 /* For ECDSA, use SHA-1, not MD-5 + SHA-1 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004035 if( mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
4036 MBEDTLS_PK_ECDSA ) )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004037 {
4038 hash_start += 16;
4039 hashlen -= 16;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004040 md_alg = MBEDTLS_MD_SHA1;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004041 }
Paul Bakker926af752012-11-23 13:38:07 +01004042 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02004043 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004044#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 ||
4045 MBEDTLS_SSL_PROTO_TLS1_1 */
4046#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4047 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004048 {
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004049 if( i + 2 > ssl->in_hslen )
4050 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004051 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
4052 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004053 }
4054
Paul Bakker5121ce52009-01-03 21:22:43 +00004055 /*
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004056 * Hash
Paul Bakker5121ce52009-01-03 21:22:43 +00004057 */
Simon Butcher99000142016-10-13 17:21:01 +01004058 md_alg = mbedtls_ssl_md_alg_from_hash( ssl->in_msg[i] );
4059
4060 if( md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md( ssl, ssl->in_msg[i] ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00004061 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004062 MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg"
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004063 " for verify message" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004064 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker926af752012-11-23 13:38:07 +01004065 }
4066
Simon Butcher99000142016-10-13 17:21:01 +01004067#if !defined(MBEDTLS_MD_SHA1)
4068 if( MBEDTLS_MD_SHA1 == md_alg )
4069 hash_start += 16;
4070#endif
Paul Bakker926af752012-11-23 13:38:07 +01004071
Manuel Pégourié-Gonnardbfe32ef2013-08-22 14:55:30 +02004072 /* Info from md_alg will be used instead */
4073 hashlen = 0;
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004074
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004075 i++;
4076
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004077 /*
4078 * Signature
4079 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004080 if( ( pk_alg = mbedtls_ssl_pk_alg_from_sig( ssl->in_msg[i] ) )
4081 == MBEDTLS_PK_NONE )
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004082 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004083 MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg"
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004084 " for verify message" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004085 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004086 }
4087
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004088 /*
4089 * Check the certificate's key type matches the signature alg
4090 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004091 if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) )
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004092 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004093 MBEDTLS_SSL_DEBUG_MSG( 1, ( "sig_alg doesn't match cert key" ) );
4094 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Manuel Pégourié-Gonnard0b032002013-08-17 13:01:41 +02004095 }
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004096
4097 i++;
Paul Bakker577e0062013-08-28 11:57:20 +02004098 }
4099 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004100#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02004101 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004102 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
4103 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02004104 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02004105
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004106 if( i + 2 > ssl->in_hslen )
4107 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004108 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
4109 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Manuel Pégourié-Gonnard5ee96542014-09-10 14:27:21 +00004110 }
4111
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004112 sig_len = ( ssl->in_msg[i] << 8 ) | ssl->in_msg[i+1];
4113 i += 2;
Paul Bakker926af752012-11-23 13:38:07 +01004114
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004115 if( i + sig_len != ssl->in_hslen )
Paul Bakker5121ce52009-01-03 21:22:43 +00004116 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004117 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
4118 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00004119 }
4120
Simon Butcher99000142016-10-13 17:21:01 +01004121 /* Calculate hash and verify signature */
4122 ssl->handshake->calc_verify( ssl, hash );
4123
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004124 if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk,
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02004125 md_alg, hash_start, hashlen,
Manuel Pégourié-Gonnard4528f3f2014-09-10 14:17:23 +00004126 ssl->in_msg + i, sig_len ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00004127 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004128 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004129 return( ret );
4130 }
4131
Simon Butcher99000142016-10-13 17:21:01 +01004132 mbedtls_ssl_update_handshake_status( ssl );
4133
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004134 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004135
Paul Bakkered27a042013-04-18 22:46:23 +02004136 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004137}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004138#endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
4139 !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
Paul Bakker29f221f2016-07-22 13:49:02 +01004140 !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED &&
4141 !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
4142 !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED &&
4143 !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004144
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004145#if defined(MBEDTLS_SSL_SESSION_TICKETS)
4146static int ssl_write_new_session_ticket( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004147{
4148 int ret;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004149 size_t tlen;
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004150 uint32_t lifetime;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004151
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004152 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write new session ticket" ) );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004153
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004154 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4155 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004156
4157 /*
4158 * struct {
4159 * uint32 ticket_lifetime_hint;
4160 * opaque ticket<0..2^16-1>;
4161 * } NewSessionTicket;
4162 *
4163 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
4164 * 8 . 9 ticket_len (n)
4165 * 10 . 9+n ticket content
4166 */
Manuel Pégourié-Gonnard164d8942013-09-23 22:01:39 +02004167
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02004168 if( ( ret = ssl->conf->f_ticket_write( ssl->conf->p_ticket,
Manuel Pégourié-Gonnard69f17282015-05-18 14:35:08 +02004169 ssl->session_negotiate,
4170 ssl->out_msg + 10,
4171 ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN,
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004172 &tlen, &lifetime ) ) != 0 )
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004173 {
Manuel Pégourié-Gonnarda4a47352015-05-15 15:14:54 +02004174 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_write", ret );
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02004175 tlen = 0;
4176 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004177
Manuel Pégourié-Gonnardb0394be2015-05-19 11:40:30 +02004178 ssl->out_msg[4] = ( lifetime >> 24 ) & 0xFF;
4179 ssl->out_msg[5] = ( lifetime >> 16 ) & 0xFF;
4180 ssl->out_msg[6] = ( lifetime >> 8 ) & 0xFF;
4181 ssl->out_msg[7] = ( lifetime ) & 0xFF;
4182
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004183 ssl->out_msg[8] = (unsigned char)( ( tlen >> 8 ) & 0xFF );
4184 ssl->out_msg[9] = (unsigned char)( ( tlen ) & 0xFF );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004185
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02004186 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004187
Manuel Pégourié-Gonnard145dfcb2014-02-26 14:23:33 +01004188 /*
4189 * Morally equivalent to updating ssl->state, but NewSessionTicket and
4190 * ChangeCipherSpec share the same state.
4191 */
4192 ssl->handshake->new_session_ticket = 0;
4193
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004194 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004195 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004196 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004197 return( ret );
4198 }
4199
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004200 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write new session ticket" ) );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004201
4202 return( 0 );
4203}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004204#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004205
Paul Bakker5121ce52009-01-03 21:22:43 +00004206/*
Paul Bakker1961b702013-01-25 14:49:24 +01004207 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00004208 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004209int mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00004210{
4211 int ret = 0;
4212
Manuel Pégourié-Gonnarddba460f2015-06-24 22:59:30 +02004213 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004214 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00004215
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004216 MBEDTLS_SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) );
Paul Bakker1961b702013-01-25 14:49:24 +01004217
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004218 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
Paul Bakker1961b702013-01-25 14:49:24 +01004219 return( ret );
4220
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004221#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02004222 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004223 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02004224 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004225 if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02004226 return( ret );
4227 }
4228#endif
4229
Paul Bakker1961b702013-01-25 14:49:24 +01004230 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00004231 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004232 case MBEDTLS_SSL_HELLO_REQUEST:
4233 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00004234 break;
4235
Paul Bakker1961b702013-01-25 14:49:24 +01004236 /*
4237 * <== ClientHello
4238 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004239 case MBEDTLS_SSL_CLIENT_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01004240 ret = ssl_parse_client_hello( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00004241 break;
Paul Bakker1961b702013-01-25 14:49:24 +01004242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004243#if defined(MBEDTLS_SSL_PROTO_DTLS)
4244 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
4245 return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED );
Manuel Pégourié-Gonnard579950c2014-09-29 17:47:33 +02004246#endif
4247
Paul Bakker1961b702013-01-25 14:49:24 +01004248 /*
4249 * ==> ServerHello
4250 * Certificate
4251 * ( ServerKeyExchange )
4252 * ( CertificateRequest )
4253 * ServerHelloDone
4254 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004255 case MBEDTLS_SSL_SERVER_HELLO:
Paul Bakker1961b702013-01-25 14:49:24 +01004256 ret = ssl_write_server_hello( ssl );
4257 break;
4258
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004259 case MBEDTLS_SSL_SERVER_CERTIFICATE:
4260 ret = mbedtls_ssl_write_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004261 break;
4262
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004263 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01004264 ret = ssl_write_server_key_exchange( ssl );
4265 break;
4266
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004267 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
Paul Bakker1961b702013-01-25 14:49:24 +01004268 ret = ssl_write_certificate_request( ssl );
4269 break;
4270
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004271 case MBEDTLS_SSL_SERVER_HELLO_DONE:
Paul Bakker1961b702013-01-25 14:49:24 +01004272 ret = ssl_write_server_hello_done( ssl );
4273 break;
4274
4275 /*
4276 * <== ( Certificate/Alert )
4277 * ClientKeyExchange
4278 * ( CertificateVerify )
4279 * ChangeCipherSpec
4280 * Finished
4281 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004282 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
4283 ret = mbedtls_ssl_parse_certificate( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004284 break;
4285
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004286 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
Paul Bakker1961b702013-01-25 14:49:24 +01004287 ret = ssl_parse_client_key_exchange( ssl );
4288 break;
4289
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004290 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
Paul Bakker1961b702013-01-25 14:49:24 +01004291 ret = ssl_parse_certificate_verify( ssl );
4292 break;
4293
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004294 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
4295 ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004296 break;
4297
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004298 case MBEDTLS_SSL_CLIENT_FINISHED:
4299 ret = mbedtls_ssl_parse_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004300 break;
4301
4302 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02004303 * ==> ( NewSessionTicket )
4304 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01004305 * Finished
4306 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004307 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4308#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02004309 if( ssl->handshake->new_session_ticket != 0 )
4310 ret = ssl_write_new_session_ticket( ssl );
4311 else
Paul Bakkera503a632013-08-14 13:48:06 +02004312#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004313 ret = mbedtls_ssl_write_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004314 break;
4315
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004316 case MBEDTLS_SSL_SERVER_FINISHED:
4317 ret = mbedtls_ssl_write_finished( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004318 break;
4319
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004320 case MBEDTLS_SSL_FLUSH_BUFFERS:
4321 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
4322 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Paul Bakker1961b702013-01-25 14:49:24 +01004323 break;
4324
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004325 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
4326 mbedtls_ssl_handshake_wrapup( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01004327 break;
4328
4329 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004330 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
4331 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00004332 }
4333
Paul Bakker5121ce52009-01-03 21:22:43 +00004334 return( ret );
4335}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004336#endif /* MBEDTLS_SSL_SRV_C */