2009-01-03 21:22:43 +00:00
/*
* SSLv3 / TLSv1 client - side functions
*
2020-08-07 11:07:28 +00:00
* Copyright The Mbed TLS Contributors
2015-09-04 12:21:07 +00:00
* SPDX - License - Identifier : Apache - 2.0
2010-07-18 20:36:00 +00:00
*
2015-09-04 12:21:07 +00:00
* Licensed under the Apache License , Version 2.0 ( the " License " ) ; you may
* not use this file except in compliance with the License .
* You may obtain a copy of the License at
2009-01-04 16:27:10 +00:00
*
2015-09-04 12:21:07 +00:00
* http : //www.apache.org/licenses/LICENSE-2.0
2009-01-03 21:22:43 +00:00
*
2015-09-04 12:21:07 +00:00
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS , WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
2009-01-03 21:22:43 +00:00
*/
2020-06-02 23:43:33 +00:00
# include "common.h"
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_CLI_C)
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_PLATFORM_C)
2015-03-09 17:05:11 +00:00
# include "mbedtls/platform.h"
2013-07-31 10:58:16 +00:00
# else
2015-02-06 13:43:58 +00:00
# include <stdlib.h>
2015-05-26 14:04:06 +00:00
# define mbedtls_calloc calloc
2016-04-26 06:43:27 +00:00
# define mbedtls_free free
2013-07-31 10:58:16 +00:00
# endif
2016-04-26 06:43:27 +00:00
# include "mbedtls/ssl.h"
# include "mbedtls/ssl_internal.h"
2019-12-18 15:07:04 +00:00
# include "mbedtls/debug.h"
# include "mbedtls/error.h"
2016-04-26 06:43:27 +00:00
2019-01-08 12:54:37 +00:00
# if defined(MBEDTLS_USE_PSA_CRYPTO)
# include "mbedtls/psa_util.h"
# endif /* MBEDTLS_USE_PSA_CRYPTO */
2016-04-26 06:43:27 +00:00
# include <string.h>
2015-06-22 17:21:23 +00:00
# include <stdint.h>
2013-07-03 13:31:03 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_HAVE_TIME)
2016-07-13 13:46:18 +00:00
# include "mbedtls/platform_time.h"
2013-07-03 13:31:03 +00:00
# endif
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_SESSION_TICKETS)
2018-04-17 14:51:09 +00:00
# include "mbedtls/platform_util.h"
2014-06-13 15:20:13 +00:00
# endif
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
2018-10-26 10:38:07 +00:00
static int ssl_conf_has_static_psk ( mbedtls_ssl_config const * conf )
2018-10-23 10:54:44 +00:00
{
if ( conf - > psk_identity = = NULL | |
conf - > psk_identity_len = = 0 )
{
return ( 0 ) ;
}
if ( conf - > psk ! = NULL & & conf - > psk_len ! = 0 )
return ( 1 ) ;
# if defined(MBEDTLS_USE_PSA_CRYPTO)
if ( conf - > psk_opaque ! = 0 )
return ( 1 ) ;
# endif /* MBEDTLS_USE_PSA_CRYPTO */
return ( 0 ) ;
}
2018-10-23 10:59:34 +00:00
# if defined(MBEDTLS_USE_PSA_CRYPTO)
2018-10-26 10:38:07 +00:00
static int ssl_conf_has_static_raw_psk ( mbedtls_ssl_config const * conf )
2018-10-23 10:59:34 +00:00
{
if ( conf - > psk_identity = = NULL | |
conf - > psk_identity_len = = 0 )
{
return ( 0 ) ;
}
if ( conf - > psk ! = NULL & & conf - > psk_len ! = 0 )
return ( 1 ) ;
return ( 0 ) ;
}
# endif /* MBEDTLS_USE_PSA_CRYPTO */
2020-03-10 11:19:08 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
2018-10-23 10:54:44 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2017-04-12 13:54:42 +00:00
static int ssl_write_hostname_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2009-01-03 21:22:43 +00:00
{
2013-03-20 15:07:17 +00:00
unsigned char * p = buf ;
2015-05-06 09:47:06 +00:00
size_t hostname_len ;
2013-03-20 15:07:17 +00:00
* olen = 0 ;
2014-06-17 14:39:18 +00:00
if ( ssl - > hostname = = NULL )
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-03-20 15:07:17 +00:00
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, adding server name extension: %s " ,
ssl - > hostname ) ) ;
2013-03-20 15:07:17 +00:00
2015-05-06 09:47:06 +00:00
hostname_len = strlen ( ssl - > hostname ) ;
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , hostname_len + 9 ) ;
2015-09-28 01:14:30 +00:00
2013-03-20 15:07:17 +00:00
/*
2017-04-07 12:02:16 +00:00
* Sect . 3 , RFC 6066 ( TLS Extensions Definitions )
*
* In order to provide any of the server names , clients MAY include an
* extension of type " server_name " in the ( extended ) client hello . The
* " extension_data " field of this extension SHALL contain
* " ServerNameList " where :
*
2013-03-20 15:07:17 +00:00
* struct {
* NameType name_type ;
* select ( name_type ) {
* case host_name : HostName ;
* } name ;
* } ServerName ;
*
* enum {
* host_name ( 0 ) , ( 255 )
* } NameType ;
*
* opaque HostName < 1. .2 ^ 16 - 1 > ;
*
* struct {
* ServerName server_name_list < 1. .2 ^ 16 - 1 >
* } ServerNameList ;
2017-04-07 12:02:16 +00:00
*
2013-03-20 15:07:17 +00:00
*/
2015-04-08 10:49:31 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_SERVERNAME > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_SERVERNAME ) & 0xFF ) ;
2013-03-20 15:07:17 +00:00
2015-05-06 09:47:06 +00:00
* p + + = ( unsigned char ) ( ( ( hostname_len + 5 ) > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( ( hostname_len + 5 ) ) & 0xFF ) ;
2013-03-20 15:07:17 +00:00
2015-05-06 09:47:06 +00:00
* p + + = ( unsigned char ) ( ( ( hostname_len + 3 ) > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( ( hostname_len + 3 ) ) & 0xFF ) ;
2013-03-20 15:07:17 +00:00
2015-04-08 10:49:31 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF ) ;
2015-05-06 09:47:06 +00:00
* p + + = ( unsigned char ) ( ( hostname_len > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( hostname_len ) & 0xFF ) ;
2013-03-20 15:07:17 +00:00
2015-05-06 09:47:06 +00:00
memcpy ( p , ssl - > hostname , hostname_len ) ;
2013-03-20 15:07:17 +00:00
2015-05-06 09:47:06 +00:00
* olen = hostname_len + 9 ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-03-20 15:07:17 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
2013-03-20 15:07:17 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_RENEGOTIATION)
2017-04-12 13:54:42 +00:00
static int ssl_write_renegotiation_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2013-03-20 15:07:17 +00:00
{
unsigned char * p = buf ;
* olen = 0 ;
2017-10-12 13:58:55 +00:00
/* We're always including an TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the
* initial ClientHello , in which case also adding the renegotiation
* info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4 . */
2015-04-08 10:49:31 +00:00
if ( ssl - > renego_status ! = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-03-20 15:07:17 +00:00
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, adding renegotiation extension " ) ) ;
2013-03-20 15:07:17 +00:00
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 5 + ssl - > verify_data_len ) ;
2015-09-28 01:14:30 +00:00
2013-03-20 15:07:17 +00:00
/*
* Secure renegotiation
*/
2017-05-08 10:06:19 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO > > 8 )
& 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO )
& 0xFF ) ;
2013-03-20 15:07:17 +00:00
* p + + = 0x00 ;
* p + + = ( ssl - > verify_data_len + 1 ) & 0xFF ;
* p + + = ssl - > verify_data_len & 0xFF ;
memcpy ( p , ssl - > own_verify_data , ssl - > verify_data_len ) ;
* olen = 5 + ssl - > verify_data_len ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-03-20 15:07:17 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_RENEGOTIATION */
2013-03-20 15:07:17 +00:00
2014-12-02 10:57:29 +00:00
/*
* Only if we handle at least one key exchange that needs signatures .
*/
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
2020-03-10 11:19:08 +00:00
defined ( MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED )
2017-04-12 13:54:42 +00:00
static int ssl_write_signature_algorithms_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2013-03-20 15:07:17 +00:00
{
unsigned char * p = buf ;
2012-04-11 16:11:49 +00:00
size_t sig_alg_len = 0 ;
2015-06-17 12:34:48 +00:00
const int * md ;
2017-04-12 13:54:42 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)
2014-06-24 13:18:11 +00:00
unsigned char * sig_alg_list = buf + 6 ;
# endif
2013-03-20 15:07:17 +00:00
* olen = 0 ;
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > max_minor_ver ! = MBEDTLS_SSL_MINOR_VERSION_3 )
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-03-20 15:07:17 +00:00
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, adding signature_algorithms extension " ) ) ;
2013-03-20 15:07:17 +00:00
2017-04-12 13:54:42 +00:00
if ( ssl - > conf - > sig_hashes = = NULL )
return ( MBEDTLS_ERR_SSL_BAD_CONFIG ) ;
2015-09-28 01:14:30 +00:00
for ( md = ssl - > conf - > sig_hashes ; * md ! = MBEDTLS_MD_NONE ; md + + )
{
# if defined(MBEDTLS_ECDSA_C)
sig_alg_len + = 2 ;
# endif
# if defined(MBEDTLS_RSA_C)
sig_alg_len + = 2 ;
# endif
2017-04-12 13:54:42 +00:00
if ( sig_alg_len > MBEDTLS_SSL_MAX_SIG_HASH_ALG_LIST_LEN )
{
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " length in bytes of sig-hash-alg extension too big " ) ) ;
return ( MBEDTLS_ERR_SSL_BAD_CONFIG ) ;
}
2015-09-28 01:14:30 +00:00
}
2017-04-12 13:54:42 +00:00
/* Empty signature algorithms list, this is a configuration error. */
if ( sig_alg_len = = 0 )
return ( MBEDTLS_ERR_SSL_BAD_CONFIG ) ;
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , sig_alg_len + 6 ) ;
2015-09-28 01:14:30 +00:00
2013-03-20 15:07:17 +00:00
/*
* Prepare signature_algorithms extension ( TLS 1.2 )
*/
2015-09-28 01:14:30 +00:00
sig_alg_len = 0 ;
2015-06-17 12:34:48 +00:00
for ( md = ssl - > conf - > sig_hashes ; * md ! = MBEDTLS_MD_NONE ; md + + )
{
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_ECDSA_C)
2015-06-17 12:34:48 +00:00
sig_alg_list [ sig_alg_len + + ] = mbedtls_ssl_hash_from_md_alg ( * md ) ;
sig_alg_list [ sig_alg_len + + ] = MBEDTLS_SSL_SIG_ECDSA ;
2013-08-22 13:57:15 +00:00
# endif
2015-06-17 12:34:48 +00:00
# if defined(MBEDTLS_RSA_C)
sig_alg_list [ sig_alg_len + + ] = mbedtls_ssl_hash_from_md_alg ( * md ) ;
sig_alg_list [ sig_alg_len + + ] = MBEDTLS_SSL_SIG_RSA ;
2013-08-22 13:57:15 +00:00
# endif
2015-06-17 12:34:48 +00:00
}
2013-03-20 15:07:17 +00:00
/*
* enum {
2015-06-17 12:34:48 +00:00
* none ( 0 ) , md5 ( 1 ) , sha1 ( 2 ) , sha224 ( 3 ) , sha256 ( 4 ) , sha384 ( 5 ) ,
* sha512 ( 6 ) , ( 255 )
2013-03-20 15:07:17 +00:00
* } HashAlgorithm ;
*
* enum { anonymous ( 0 ) , rsa ( 1 ) , dsa ( 2 ) , ecdsa ( 3 ) , ( 255 ) }
* SignatureAlgorithm ;
*
* struct {
* HashAlgorithm hash ;
* SignatureAlgorithm signature ;
* } SignatureAndHashAlgorithm ;
*
* SignatureAndHashAlgorithm
* supported_signature_algorithms < 2. .2 ^ 16 - 2 > ;
*/
2015-04-08 10:49:31 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_SIG_ALG > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_SIG_ALG ) & 0xFF ) ;
2013-03-20 15:07:17 +00:00
* p + + = ( unsigned char ) ( ( ( sig_alg_len + 2 ) > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( ( sig_alg_len + 2 ) ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( sig_alg_len > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( sig_alg_len ) & 0xFF ) ;
* olen = 6 + sig_alg_len ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-03-20 15:07:17 +00:00
}
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_SSL_PROTO_TLS1_2 &&
2020-03-10 11:19:08 +00:00
MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
2013-03-20 15:07:17 +00:00
2015-09-15 08:53:51 +00:00
# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
2015-10-06 16:11:18 +00:00
defined ( MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED )
2017-04-12 13:54:42 +00:00
static int ssl_write_supported_elliptic_curves_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2013-03-20 15:07:17 +00:00
{
unsigned char * p = buf ;
2014-01-23 16:27:10 +00:00
unsigned char * elliptic_curve_list = p + 6 ;
2013-03-20 13:39:14 +00:00
size_t elliptic_curve_len = 0 ;
2015-04-08 10:49:31 +00:00
const mbedtls_ecp_curve_info * info ;
const mbedtls_ecp_group_id * grp_id ;
2013-03-20 15:07:17 +00:00
* olen = 0 ;
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, adding supported_elliptic_curves extension " ) ) ;
2013-03-20 15:07:17 +00:00
2017-04-12 13:54:42 +00:00
if ( ssl - > conf - > curve_list = = NULL )
return ( MBEDTLS_ERR_SSL_BAD_CONFIG ) ;
2017-05-08 10:06:19 +00:00
for ( grp_id = ssl - > conf - > curve_list ;
* grp_id ! = MBEDTLS_ECP_DP_NONE ;
grp_id + + )
2015-09-28 01:14:30 +00:00
{
2017-05-03 10:28:43 +00:00
info = mbedtls_ecp_curve_info_from_grp_id ( * grp_id ) ;
2016-04-21 22:37:09 +00:00
if ( info = = NULL )
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " invalid curve in ssl configuration " ) ) ;
2017-04-12 13:54:42 +00:00
return ( MBEDTLS_ERR_SSL_BAD_CONFIG ) ;
2016-04-21 22:37:09 +00:00
}
2015-09-28 01:14:30 +00:00
elliptic_curve_len + = 2 ;
2017-04-12 13:54:42 +00:00
if ( elliptic_curve_len > MBEDTLS_SSL_MAX_CURVE_LIST_LEN )
{
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " malformed supported_elliptic_curves extension in config " ) ) ;
return ( MBEDTLS_ERR_SSL_BAD_CONFIG ) ;
}
2015-09-28 01:14:30 +00:00
}
2017-04-12 13:54:42 +00:00
/* Empty elliptic curve list, this is a configuration error. */
2017-04-12 13:54:42 +00:00
if ( elliptic_curve_len = = 0 )
2017-04-12 13:54:42 +00:00
return ( MBEDTLS_ERR_SSL_BAD_CONFIG ) ;
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 6 + elliptic_curve_len ) ;
2015-09-28 01:14:30 +00:00
elliptic_curve_len = 0 ;
2017-05-08 10:06:19 +00:00
for ( grp_id = ssl - > conf - > curve_list ;
* grp_id ! = MBEDTLS_ECP_DP_NONE ;
grp_id + + )
2013-09-16 15:30:04 +00:00
{
2017-05-03 10:28:43 +00:00
info = mbedtls_ecp_curve_info_from_grp_id ( * grp_id ) ;
2014-02-04 14:14:13 +00:00
elliptic_curve_list [ elliptic_curve_len + + ] = info - > tls_id > > 8 ;
elliptic_curve_list [ elliptic_curve_len + + ] = info - > tls_id & 0xFF ;
2013-09-16 15:30:04 +00:00
}
2013-06-29 21:26:34 +00:00
2017-05-08 10:06:19 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES > > 8 )
& 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES )
& 0xFF ) ;
2013-03-20 15:07:17 +00:00
* p + + = ( unsigned char ) ( ( ( elliptic_curve_len + 2 ) > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( ( elliptic_curve_len + 2 ) ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( ( elliptic_curve_len ) > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( ( elliptic_curve_len ) ) & 0xFF ) ;
* olen = 6 + elliptic_curve_len ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-03-20 15:07:17 +00:00
}
2017-04-12 13:54:42 +00:00
static int ssl_write_supported_point_formats_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2013-03-20 15:07:17 +00:00
{
unsigned char * p = buf ;
2017-04-12 13:54:42 +00:00
( void ) ssl ; /* ssl used for debugging only */
2013-03-20 15:07:17 +00:00
* olen = 0 ;
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, adding supported_point_formats extension " ) ) ;
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 6 ) ;
2015-09-28 01:14:30 +00:00
2017-05-08 10:06:19 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS > > 8 )
& 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS )
& 0xFF ) ;
2013-03-20 15:07:17 +00:00
* p + + = 0x00 ;
* p + + = 2 ;
2013-08-15 15:42:02 +00:00
* p + + = 1 ;
2015-04-08 10:49:31 +00:00
* p + + = MBEDTLS_ECP_PF_UNCOMPRESSED ;
2013-03-20 15:07:17 +00:00
2013-08-15 15:42:02 +00:00
* olen = 6 ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-03-20 15:07:17 +00:00
}
2018-03-13 15:22:58 +00:00
# endif / * MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
2015-10-06 16:11:18 +00:00
MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2009-01-03 21:22:43 +00:00
2015-09-16 08:05:04 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2017-04-12 13:54:42 +00:00
static int ssl_write_ecjpake_kkpp_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2015-09-15 14:55:05 +00:00
{
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2015-09-15 14:55:05 +00:00
unsigned char * p = buf ;
size_t kkpp_len ;
* olen = 0 ;
/* Skip costly extension if we can't use EC J-PAKE anyway */
if ( mbedtls_ecjpake_check ( & ssl - > handshake - > ecjpake_ctx ) ! = 0 )
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2015-09-15 14:55:05 +00:00
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, adding ecjpake_kkpp extension " ) ) ;
2015-09-15 14:55:05 +00:00
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 4 ) ;
2015-09-15 14:55:05 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF ) ;
2015-09-17 12:16:30 +00:00
/*
* We may need to send ClientHello multiple times for Hello verification .
* We don ' t want to compute fresh values every time ( both for performance
* and consistency reasons ) , so cache the extension content .
*/
if ( ssl - > handshake - > ecjpake_cache = = NULL | |
ssl - > handshake - > ecjpake_cache_len = = 0 )
2015-09-15 14:55:05 +00:00
{
2015-09-17 12:16:30 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " generating new ecjpake parameters " ) ) ;
2015-10-19 13:14:03 +00:00
ret = mbedtls_ecjpake_write_round_one ( & ssl - > handshake - > ecjpake_ctx ,
2017-04-12 13:54:42 +00:00
p + 2 , end - p - 2 , & kkpp_len ,
ssl - > conf - > f_rng , ssl - > conf - > p_rng ) ;
2015-10-19 13:14:03 +00:00
if ( ret ! = 0 )
2015-09-17 12:16:30 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 ,
" mbedtls_ecjpake_write_round_one " , ret ) ;
2017-04-12 13:54:42 +00:00
return ( ret ) ;
2015-09-17 12:16:30 +00:00
}
ssl - > handshake - > ecjpake_cache = mbedtls_calloc ( 1 , kkpp_len ) ;
if ( ssl - > handshake - > ecjpake_cache = = NULL )
{
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " allocation failed " ) ) ;
2017-04-12 13:54:42 +00:00
return ( MBEDTLS_ERR_SSL_ALLOC_FAILED ) ;
2015-09-17 12:16:30 +00:00
}
memcpy ( ssl - > handshake - > ecjpake_cache , p + 2 , kkpp_len ) ;
ssl - > handshake - > ecjpake_cache_len = kkpp_len ;
}
else
{
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " re-using cached ecjpake parameters " ) ) ;
kkpp_len = ssl - > handshake - > ecjpake_cache_len ;
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p + 2 , end , kkpp_len ) ;
2015-09-17 12:16:30 +00:00
memcpy ( p + 2 , ssl - > handshake - > ecjpake_cache , kkpp_len ) ;
2015-09-15 14:55:05 +00:00
}
* p + + = ( unsigned char ) ( ( kkpp_len > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( kkpp_len ) & 0xFF ) ;
* olen = kkpp_len + 4 ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2015-09-15 14:55:05 +00:00
}
2015-09-16 08:05:04 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2009-01-03 21:22:43 +00:00
2019-05-15 13:03:01 +00:00
# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2017-04-12 13:54:42 +00:00
static int ssl_write_cid_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2019-04-25 15:55:15 +00:00
{
unsigned char * p = buf ;
size_t ext_len ;
/*
2019-05-15 09:26:32 +00:00
* Quoting draft - ietf - tls - dtls - connection - id - 05
* https : //tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
2019-04-25 15:55:15 +00:00
*
* struct {
* opaque cid < 0. .2 ^ 8 - 1 > ;
* } ConnectionId ;
*/
* olen = 0 ;
if ( ssl - > conf - > transport ! = MBEDTLS_SSL_TRANSPORT_DATAGRAM | |
ssl - > negotiate_cid = = MBEDTLS_SSL_CID_DISABLED )
{
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2019-04-25 15:55:15 +00:00
}
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, adding CID extension " ) ) ;
/* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
* which is at most 255 , so the increment cannot overflow . */
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , ( unsigned ) ( ssl - > own_cid_len + 5 ) ) ;
2019-04-25 15:55:15 +00:00
/* Add extension ID + size */
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_CID > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_CID ) & 0xFF ) ;
ext_len = ( size_t ) ssl - > own_cid_len + 1 ;
* p + + = ( unsigned char ) ( ( ext_len > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( ext_len ) & 0xFF ) ;
* p + + = ( uint8_t ) ssl - > own_cid_len ;
memcpy ( p , ssl - > own_cid , ssl - > own_cid_len ) ;
* olen = ssl - > own_cid_len + 5 ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2019-04-25 15:55:15 +00:00
}
2019-05-15 13:03:01 +00:00
# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
2019-04-25 15:55:15 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2017-04-12 13:54:42 +00:00
static int ssl_write_max_fragment_length_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2013-07-16 15:26:28 +00:00
{
unsigned char * p = buf ;
2015-09-28 19:52:04 +00:00
* olen = 0 ;
2017-04-12 13:54:42 +00:00
if ( ssl - > conf - > mfl_code = = MBEDTLS_SSL_MAX_FRAG_LEN_NONE )
return ( 0 ) ;
2013-07-16 15:26:28 +00:00
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, adding max_fragment_length extension " ) ) ;
2013-07-16 15:26:28 +00:00
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 5 ) ;
2015-09-28 01:14:30 +00:00
2017-05-08 10:06:19 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH > > 8 )
& 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH )
& 0xFF ) ;
2013-07-16 15:26:28 +00:00
* p + + = 0x00 ;
* p + + = 1 ;
2015-05-04 08:55:58 +00:00
* p + + = ssl - > conf - > mfl_code ;
2013-07-16 15:26:28 +00:00
* olen = 5 ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-07-16 15:26:28 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
2013-07-16 15:26:28 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
2017-04-12 13:54:42 +00:00
static int ssl_write_truncated_hmac_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2013-07-19 09:41:43 +00:00
{
unsigned char * p = buf ;
2015-09-28 19:52:04 +00:00
* olen = 0 ;
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > trunc_hmac = = MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-07-19 09:41:43 +00:00
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, adding truncated_hmac extension " ) ) ;
2013-07-19 09:41:43 +00:00
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 4 ) ;
2015-09-28 01:14:30 +00:00
2015-04-08 10:49:31 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF ) ;
2013-07-19 09:41:43 +00:00
* p + + = 0x00 ;
* p + + = 0x00 ;
* olen = 4 ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-07-19 09:41:43 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
2013-07-19 09:41:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2017-04-12 13:54:42 +00:00
static int ssl_write_encrypt_then_mac_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2014-10-27 12:57:03 +00:00
{
unsigned char * p = buf ;
2015-09-28 19:52:04 +00:00
* olen = 0 ;
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > encrypt_then_mac = = MBEDTLS_SSL_ETM_DISABLED | |
ssl - > conf - > max_minor_ver = = MBEDTLS_SSL_MINOR_VERSION_0 )
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2014-10-27 12:57:03 +00:00
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, adding encrypt_then_mac extension " ) ) ;
2014-10-27 12:57:03 +00:00
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 4 ) ;
2015-09-28 01:14:30 +00:00
2015-04-08 10:49:31 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF ) ;
2014-10-27 12:57:03 +00:00
* p + + = 0x00 ;
* p + + = 0x00 ;
* olen = 4 ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2014-10-27 12:57:03 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
2014-10-27 12:57:03 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2017-04-12 13:54:42 +00:00
static int ssl_write_extended_ms_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2014-10-20 16:40:56 +00:00
{
unsigned char * p = buf ;
2015-09-28 19:52:04 +00:00
* olen = 0 ;
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > extended_ms = = MBEDTLS_SSL_EXTENDED_MS_DISABLED | |
ssl - > conf - > max_minor_ver = = MBEDTLS_SSL_MINOR_VERSION_0 )
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2014-10-20 16:40:56 +00:00
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, adding extended_master_secret extension " ) ) ;
2014-10-20 16:40:56 +00:00
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 4 ) ;
2015-09-28 01:14:30 +00:00
2017-05-08 10:06:19 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET > > 8 )
& 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET )
& 0xFF ) ;
2014-10-20 16:40:56 +00:00
* p + + = 0x00 ;
* p + + = 0x00 ;
* olen = 4 ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2014-10-20 16:40:56 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
2014-10-20 16:40:56 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_SESSION_TICKETS)
2017-04-12 13:54:42 +00:00
static int ssl_write_session_ticket_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2013-08-02 12:44:54 +00:00
{
unsigned char * p = buf ;
size_t tlen = ssl - > session_negotiate - > ticket_len ;
2015-09-28 19:52:04 +00:00
* olen = 0 ;
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > session_tickets = = MBEDTLS_SSL_SESSION_TICKETS_DISABLED )
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-08-03 11:02:31 +00:00
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, adding session ticket extension " ) ) ;
2013-08-02 12:44:54 +00:00
2017-04-12 13:54:42 +00:00
/* The addition is safe here since the ticket length is 16 bit. */
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 4 + tlen ) ;
2015-09-28 01:14:30 +00:00
2015-04-08 10:49:31 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_SESSION_TICKET > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF ) ;
2013-08-02 12:44:54 +00:00
* p + + = ( unsigned char ) ( ( tlen > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( tlen ) & 0xFF ) ;
* olen = 4 ;
2015-09-28 01:14:30 +00:00
if ( ssl - > session_negotiate - > ticket = = NULL | | tlen = = 0 )
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-08-02 12:44:54 +00:00
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " sending session ticket of length %d " , tlen ) ) ;
2013-08-02 12:44:54 +00:00
memcpy ( p , ssl - > session_negotiate - > ticket , tlen ) ;
* olen + = tlen ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2013-08-02 12:44:54 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_SESSION_TICKETS */
2013-08-02 12:44:54 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_ALPN)
2017-04-12 13:54:42 +00:00
static int ssl_write_alpn_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf ,
const unsigned char * end ,
size_t * olen )
2014-04-07 08:57:45 +00:00
{
unsigned char * p = buf ;
2015-09-28 01:14:30 +00:00
size_t alpnlen = 0 ;
2014-04-07 08:57:45 +00:00
const char * * cur ;
2015-09-28 19:52:04 +00:00
* olen = 0 ;
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > alpn_list = = NULL )
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2014-04-07 08:57:45 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, adding alpn extension " ) ) ;
2014-04-07 08:57:45 +00:00
2015-09-28 01:14:30 +00:00
for ( cur = ssl - > conf - > alpn_list ; * cur ! = NULL ; cur + + )
2017-04-12 13:54:42 +00:00
alpnlen + = strlen ( * cur ) + 1 ;
2015-09-28 01:14:30 +00:00
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 6 + alpnlen ) ;
2015-09-28 01:14:30 +00:00
2015-04-08 10:49:31 +00:00
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_ALPN > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF ) ;
2014-04-07 08:57:45 +00:00
/*
* opaque ProtocolName < 1. .2 ^ 8 - 1 > ;
*
* struct {
* ProtocolName protocol_name_list < 2. .2 ^ 16 - 1 >
* } ProtocolNameList ;
*/
/* Skip writing extension and list length for now */
p + = 4 ;
2015-05-04 08:55:58 +00:00
for ( cur = ssl - > conf - > alpn_list ; * cur ! = NULL ; cur + + )
2014-04-07 08:57:45 +00:00
{
2017-04-12 13:54:42 +00:00
/*
* mbedtls_ssl_conf_set_alpn_protocols ( ) checked that the length of
* protocol names is less than 255.
*/
* p = ( unsigned char ) strlen ( * cur ) ;
2014-04-07 08:57:45 +00:00
memcpy ( p + 1 , * cur , * p ) ;
p + = 1 + * p ;
}
* olen = p - buf ;
/* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
buf [ 4 ] = ( unsigned char ) ( ( ( * olen - 6 ) > > 8 ) & 0xFF ) ;
buf [ 5 ] = ( unsigned char ) ( ( ( * olen - 6 ) ) & 0xFF ) ;
/* Extension length = olen - 2 (ext_type) - 2 (ext_len) */
buf [ 2 ] = ( unsigned char ) ( ( ( * olen - 4 ) > > 8 ) & 0xFF ) ;
buf [ 3 ] = ( unsigned char ) ( ( ( * olen - 4 ) ) & 0xFF ) ;
2017-04-12 13:54:42 +00:00
return ( 0 ) ;
2014-04-07 08:57:45 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_ALPN */
2014-04-07 08:57:45 +00:00
2015-12-03 20:56:45 +00:00
# if defined (MBEDTLS_SSL_DTLS_SRTP)
static void ssl_write_use_srtp_ext ( mbedtls_ssl_context * ssl ,
unsigned char * buf , size_t * olen )
{
unsigned char * p = buf ;
size_t protection_profiles_index = 0 ;
2018-01-22 10:30:04 +00:00
size_t mki_len = 0 , i ;
2015-12-03 20:56:45 +00:00
* olen = 0 ;
2017-12-21 08:15:08 +00:00
if ( ( ssl - > conf - > dtls_srtp_profile_list = = NULL ) | | ( ssl - > conf - > dtls_srtp_profile_list_len = = 0 ) )
2015-12-03 20:56:45 +00:00
{
return ;
}
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, adding use_srtp extension " ) ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_USE_SRTP > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( MBEDTLS_TLS_EXT_USE_SRTP ) & 0xFF ) ;
/* RFC5764 section 4.1.1
* uint8 SRTPProtectionProfile [ 2 ] ;
*
* struct {
* SRTPProtectionProfiles SRTPProtectionProfiles ;
* opaque srtp_mki < 0. .255 > ;
* } UseSRTPData ;
* SRTPProtectionProfile SRTPProtectionProfiles < 2. .2 ^ 16 - 1 > ;
*
*/
2018-01-22 10:30:04 +00:00
if ( ssl - > conf - > dtls_srtp_mki_support = = MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED & &
ssl - > dtls_srtp_info . mki_len ! = 0 )
{
mki_len = ssl - > dtls_srtp_info . mki_len ;
}
/* Extension length = 2bytes for profiles length, ssl->conf->dtls_srtp_profile_list_len*2 (each profile is 2 bytes length ) + 1 byte for srtp_mki vector length and the mki_len value */
* p + + = ( unsigned char ) ( ( ( 2 + 2 * ( ssl - > conf - > dtls_srtp_profile_list_len ) + 1 + mki_len ) > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( ( 2 + 2 * ( ssl - > conf - > dtls_srtp_profile_list_len ) + 1 + mki_len ) ) & 0xFF ) ;
2015-12-03 20:56:45 +00:00
2017-12-21 08:15:08 +00:00
/* protection profile length: 2*(ssl->conf->dtls_srtp_profile_list_len) */
* p + + = ( unsigned char ) ( ( ( 2 * ( ssl - > conf - > dtls_srtp_profile_list_len ) ) > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( 2 * ( ssl - > conf - > dtls_srtp_profile_list_len ) ) & 0xFF ) ;
2015-12-03 20:56:45 +00:00
2017-12-21 08:15:08 +00:00
for ( protection_profiles_index = 0 ; protection_profiles_index < ssl - > conf - > dtls_srtp_profile_list_len ; protection_profiles_index + + )
2015-12-03 20:56:45 +00:00
{
2017-12-21 08:15:08 +00:00
switch ( ssl - > conf - > dtls_srtp_profile_list [ protection_profiles_index ] ) {
2015-12-03 20:56:45 +00:00
case MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_80 :
2017-12-21 08:15:08 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " ssl_write_use_srtp_ext, add profile: %04x " ,
MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_80_IANA_VALUE ) ) ;
2015-12-03 20:56:45 +00:00
* p + + = ( ( ( MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_80_IANA_VALUE ) > > 8 ) & 0xFF ) ;
* p + + = ( ( MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_80_IANA_VALUE ) & 0xFF ) ;
break ;
case MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_32 :
2017-12-21 08:15:08 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " ssl_write_use_srtp_ext, add profile: %04x " ,
MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_32_IANA_VALUE ) ) ;
2015-12-03 20:56:45 +00:00
* p + + = ( ( ( MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_32_IANA_VALUE ) > > 8 ) & 0xFF ) ;
* p + + = ( ( MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_32_IANA_VALUE ) & 0xFF ) ;
break ;
case MBEDTLS_SRTP_NULL_HMAC_SHA1_80 :
2017-12-21 08:15:08 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " ssl_write_use_srtp_ext, add profile: %04x " ,
MBEDTLS_SRTP_NULL_HMAC_SHA1_80_IANA_VALUE ) ) ;
2015-12-03 20:56:45 +00:00
* p + + = ( ( ( MBEDTLS_SRTP_NULL_HMAC_SHA1_80_IANA_VALUE ) > > 8 ) & 0xFF ) ;
* p + + = ( ( MBEDTLS_SRTP_NULL_HMAC_SHA1_80_IANA_VALUE ) & 0xFF ) ;
break ;
case MBEDTLS_SRTP_NULL_HMAC_SHA1_32 :
2017-12-21 08:15:08 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " ssl_write_use_srtp_ext, add profile: %04x " ,
MBEDTLS_SRTP_NULL_HMAC_SHA1_32_IANA_VALUE ) ) ;
2015-12-03 20:56:45 +00:00
* p + + = ( ( ( MBEDTLS_SRTP_NULL_HMAC_SHA1_32_IANA_VALUE ) > > 8 ) & 0xFF ) ;
* p + + = ( ( MBEDTLS_SRTP_NULL_HMAC_SHA1_32_IANA_VALUE ) & 0xFF ) ;
break ;
default :
/* Note: we shall never arrive here as protection profiles is checked by ssl_set_dtls_srtp_protection_profiles function */
2017-12-21 08:15:08 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " client hello, ignore illegal DTLS-SRTP protection profile %d " , ssl - > conf - > dtls_srtp_profile_list [ protection_profiles_index ] ) ) ;
2015-12-03 20:56:45 +00:00
break ;
}
}
2018-01-22 10:30:04 +00:00
* p + + = mki_len & 0xFF ;
if ( mki_len ! = 0 )
{
for ( i = 0 ; i < mki_len ; i + + )
{
* p + + = ssl - > dtls_srtp_info . mki_value [ i ] ;
}
}
2015-12-03 20:56:45 +00:00
/* total extension length: extension type (2 bytes) + extension length (2 bytes) + protection profile length (2 bytes) + 2*nb protection profiles + srtp_mki vector length(1 byte)*/
2018-01-22 10:30:04 +00:00
* olen = 2 + 2 + 2 + 2 * ( ssl - > conf - > dtls_srtp_profile_list_len ) + 1 + mki_len ;
2015-12-03 20:56:45 +00:00
}
# endif /* MBEDTLS_SSL_DTLS_SRTP */
2014-07-22 13:53:27 +00:00
/*
* Generate random bytes for ClientHello
*/
2015-04-08 10:49:31 +00:00
static int ssl_generate_random ( mbedtls_ssl_context * ssl )
2014-07-22 13:53:27 +00:00
{
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2014-07-22 13:53:27 +00:00
unsigned char * p = ssl - > handshake - > randbytes ;
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_HAVE_TIME)
2016-04-26 06:43:27 +00:00
mbedtls_time_t t ;
2014-07-22 13:53:27 +00:00
# endif
2014-07-22 13:59:14 +00:00
/*
* When responding to a verify request , MUST reuse random ( RFC 6347 4.2 .1 )
*/
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_DTLS)
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > transport = = MBEDTLS_SSL_TRANSPORT_DATAGRAM & &
2014-07-22 13:59:14 +00:00
ssl - > handshake - > verify_cookie ! = NULL )
{
return ( 0 ) ;
}
# endif
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_HAVE_TIME)
2016-04-26 06:43:27 +00:00
t = mbedtls_time ( NULL ) ;
2014-07-22 13:53:27 +00:00
* p + + = ( unsigned char ) ( t > > 24 ) ;
* p + + = ( unsigned char ) ( t > > 16 ) ;
* p + + = ( unsigned char ) ( t > > 8 ) ;
* p + + = ( unsigned char ) ( t ) ;
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, current time: %lu " , t ) ) ;
2014-07-22 13:53:27 +00:00
# else
2015-05-07 11:35:38 +00:00
if ( ( ret = ssl - > conf - > f_rng ( ssl - > conf - > p_rng , p , 4 ) ) ! = 0 )
2014-07-22 13:53:27 +00:00
return ( ret ) ;
p + = 4 ;
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_HAVE_TIME */
2014-07-22 13:53:27 +00:00
2015-05-07 11:35:38 +00:00
if ( ( ret = ssl - > conf - > f_rng ( ssl - > conf - > p_rng , p , 28 ) ) ! = 0 )
2014-07-22 13:53:27 +00:00
return ( ret ) ;
return ( 0 ) ;
}
2018-04-18 18:35:00 +00:00
/**
* \ brief Validate cipher suite against config in SSL context .
*
* \ param suite_info cipher suite to validate
* \ param ssl SSL context
2018-04-25 09:06:07 +00:00
* \ param min_minor_ver Minimal minor version to accept a cipher suite
* \ param max_minor_ver Maximal minor version to accept a cipher suite
2018-04-18 18:35:00 +00:00
*
* \ return 0 if valid , else 1
*/
2017-05-08 10:06:19 +00:00
static int ssl_validate_ciphersuite (
const mbedtls_ssl_ciphersuite_t * suite_info ,
const mbedtls_ssl_context * ssl ,
int min_minor_ver , int max_minor_ver )
2018-04-18 18:35:00 +00:00
{
2018-04-25 09:06:07 +00:00
( void ) ssl ;
2018-04-18 18:35:00 +00:00
if ( suite_info = = NULL )
return ( 1 ) ;
2018-04-25 09:06:07 +00:00
if ( suite_info - > min_minor_ver > max_minor_ver | |
suite_info - > max_minor_ver < min_minor_ver )
2018-04-18 18:35:00 +00:00
return ( 1 ) ;
# if defined(MBEDTLS_SSL_PROTO_DTLS)
if ( ssl - > conf - > transport = = MBEDTLS_SSL_TRANSPORT_DATAGRAM & &
( suite_info - > flags & MBEDTLS_CIPHERSUITE_NODTLS ) )
return ( 1 ) ;
# endif
# if defined(MBEDTLS_ARC4_C)
if ( ssl - > conf - > arc4_disabled = = MBEDTLS_SSL_ARC4_DISABLED & &
suite_info - > cipher = = MBEDTLS_CIPHER_ARC4_128 )
return ( 1 ) ;
# endif
# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
if ( suite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECJPAKE & &
mbedtls_ecjpake_check ( & ssl - > handshake - > ecjpake_ctx ) ! = 0 )
return ( 1 ) ;
# endif
2018-10-23 10:54:44 +00:00
/* Don't suggest PSK-based ciphersuite if no PSK is available. */
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
2018-10-23 10:54:44 +00:00
if ( mbedtls_ssl_ciphersuite_uses_psk ( suite_info ) & &
2018-10-26 10:38:07 +00:00
ssl_conf_has_static_psk ( ssl - > conf ) = = 0 )
2018-10-23 10:54:44 +00:00
{
return ( 1 ) ;
}
2020-03-10 11:19:08 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
2018-10-23 10:54:44 +00:00
2018-04-18 18:35:00 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
static int ssl_write_client_hello ( mbedtls_ssl_context * ssl )
2013-03-20 15:07:17 +00:00
{
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2013-03-20 15:07:17 +00:00
size_t i , n , olen , ext_len = 0 ;
2017-04-12 13:54:42 +00:00
2013-03-20 15:07:17 +00:00
unsigned char * buf ;
2013-06-29 14:01:15 +00:00
unsigned char * p , * q ;
2017-04-12 13:54:42 +00:00
const unsigned char * end ;
2014-07-14 15:38:41 +00:00
unsigned char offer_compress ;
2013-04-15 13:09:54 +00:00
const int * ciphersuites ;
2015-04-08 10:49:31 +00:00
const mbedtls_ssl_ciphersuite_t * ciphersuite_info ;
2018-02-14 17:30:48 +00:00
# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
defined ( MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED )
int uses_ec = 0 ;
# endif
2013-03-20 15:07:17 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " => write client hello " ) ) ;
2009-01-03 21:22:43 +00:00
2015-05-07 11:35:38 +00:00
if ( ssl - > conf - > f_rng = = NULL )
2013-11-21 16:31:06 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " no RNG provided " ) ) ;
return ( MBEDTLS_ERR_SSL_NO_RNG ) ;
2013-11-21 16:31:06 +00:00
}
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_RENEGOTIATION)
if ( ssl - > renego_status = = MBEDTLS_SSL_INITIAL_HANDSHAKE )
2014-11-03 07:23:14 +00:00
# endif
2012-09-16 19:57:18 +00:00
{
2015-05-04 08:55:58 +00:00
ssl - > major_ver = ssl - > conf - > min_major_ver ;
ssl - > minor_ver = ssl - > conf - > min_minor_ver ;
2012-09-16 19:57:18 +00:00
}
2009-01-03 21:22:43 +00:00
2015-05-10 21:27:38 +00:00
if ( ssl - > conf - > max_major_ver = = 0 )
2011-10-06 13:04:09 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " configured max major version is invalid, consider using mbedtls_ssl_config_defaults() " ) ) ;
2015-05-10 21:27:38 +00:00
return ( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ) ;
2011-10-06 13:04:09 +00:00
}
2009-01-03 21:22:43 +00:00
2017-04-12 13:54:42 +00:00
buf = ssl - > out_msg ;
end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN ;
2009-01-03 21:22:43 +00:00
/*
2017-04-12 13:54:42 +00:00
* Check if there ' s enough space for the first part of the ClientHello
* consisting of the 38 bytes described below , the session identifier ( at
* most 32 bytes ) and its length ( 1 byte ) .
*
* Use static upper bounds instead of the actual values
* to allow the compiler to optimize this away .
*/
MBEDTLS_SSL_CHK_BUF_PTR ( buf , end , 38 + 1 + 32 ) ;
/*
* The 38 first bytes of the ClientHello :
* 0 . 0 handshake type ( written later )
* 1 . 3 handshake length ( written later )
2009-01-03 21:22:43 +00:00
* 4 . 5 highest version supported
* 6 . 9 current UNIX time
* 10 . 37 random bytes
2017-04-12 13:54:42 +00:00
*
* The current UNIX time ( 4 bytes ) and following 28 random bytes are written
* by ssl_generate_random ( ) into ssl - > handshake - > randbytes buffer and then
* copied from there into the output buffer .
2009-01-03 21:22:43 +00:00
*/
2017-04-12 13:54:42 +00:00
p = buf + 4 ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_write_version ( ssl - > conf - > max_major_ver ,
ssl - > conf - > max_minor_ver ,
ssl - > conf - > transport , p ) ;
2014-02-11 17:15:03 +00:00
p + = 2 ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, max version: [%d:%d] " ,
2009-01-03 21:22:43 +00:00
buf [ 4 ] , buf [ 5 ] ) ) ;
2014-07-22 13:53:27 +00:00
if ( ( ret = ssl_generate_random ( ssl ) ) ! = 0 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_generate_random " , ret ) ;
2011-11-27 21:07:34 +00:00
return ( ret ) ;
2014-07-22 13:53:27 +00:00
}
2011-11-27 21:07:34 +00:00
2014-07-22 13:53:27 +00:00
memcpy ( p , ssl - > handshake - > randbytes , 32 ) ;
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_BUF ( 3 , " client hello, random bytes " , p , 32 ) ;
2014-07-22 13:53:27 +00:00
p + = 32 ;
2009-01-03 21:22:43 +00:00
/*
* 38 . 38 session id length
* 39 . 39 + n session id
2014-03-21 08:40:12 +00:00
* 39 + n . 39 + n DTLS only : cookie length ( 1 byte )
2017-04-12 13:54:42 +00:00
* 40 + n . . . DTLS only : cookie
2014-03-21 08:40:12 +00:00
* . . . . . ciphersuitelist length ( 2 bytes )
* . . . . . ciphersuitelist
* . . . . . compression methods length ( 1 byte )
2012-04-11 16:11:49 +00:00
* . . . . . compression methods
2014-03-21 08:40:12 +00:00
* . . . . . extensions length ( 2 bytes )
2012-04-11 16:11:49 +00:00
* . . . . . extensions
2009-01-03 21:22:43 +00:00
*/
2015-06-18 13:50:37 +00:00
n = ssl - > session_negotiate - > id_len ;
2009-01-03 21:22:43 +00:00
2014-11-03 07:23:14 +00:00
if ( n < 16 | | n > 32 | |
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_RENEGOTIATION)
ssl - > renego_status ! = MBEDTLS_SSL_INITIAL_HANDSHAKE | |
2014-11-03 07:23:14 +00:00
# endif
2012-09-25 21:55:46 +00:00
ssl - > handshake - > resume = = 0 )
2013-07-31 14:31:33 +00:00
{
2009-01-03 21:22:43 +00:00
n = 0 ;
2013-07-31 14:31:33 +00:00
}
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_SESSION_TICKETS)
2013-07-31 14:31:33 +00:00
/*
* RFC 5077 section 3.4 : " When presenting a ticket, the client MAY
* generate and include a Session ID in the TLS ClientHello . "
*/
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_RENEGOTIATION)
if ( ssl - > renego_status = = MBEDTLS_SSL_INITIAL_HANDSHAKE )
2015-01-22 11:06:40 +00:00
# endif
2015-03-10 11:40:43 +00:00
{
2015-01-22 11:06:40 +00:00
if ( ssl - > session_negotiate - > ticket ! = NULL & &
ssl - > session_negotiate - > ticket_len ! = 0 )
{
2017-05-08 10:06:19 +00:00
ret = ssl - > conf - > f_rng ( ssl - > conf - > p_rng ,
ssl - > session_negotiate - > id , 32 ) ;
2013-07-31 14:31:33 +00:00
2015-01-22 11:06:40 +00:00
if ( ret ! = 0 )
return ( ret ) ;
2013-07-31 14:31:33 +00:00
2015-06-18 13:50:37 +00:00
ssl - > session_negotiate - > id_len = n = 32 ;
2015-01-22 11:06:40 +00:00
}
2013-07-31 14:31:33 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_SESSION_TICKETS */
2009-01-03 21:22:43 +00:00
2017-04-12 13:54:42 +00:00
/*
* The first check of the output buffer size above (
* MBEDTLS_SSL_CHK_BUF_PTR ( buf , end , 38 + 1 + 32 ) ; )
* has checked that there is enough space in the output buffer for the
* session identifier length byte and the session identifier ( n < = 32 ) .
*/
2009-01-03 21:22:43 +00:00
* p + + = ( unsigned char ) n ;
for ( i = 0 ; i < n ; i + + )
2012-09-16 19:57:18 +00:00
* p + + = ssl - > session_negotiate - > id [ i ] ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, session id len.: %d " , n ) ) ;
MBEDTLS_SSL_DEBUG_BUF ( 3 , " client hello, session id " , buf + 39 , n ) ;
2009-01-03 21:22:43 +00:00
2017-04-12 13:54:42 +00:00
/*
* With ' n ' being the length of the session identifier
*
* 39 + n . 39 + n DTLS only : cookie length ( 1 byte )
* 40 + n . . . DTLS only : cookie
* . . . . . ciphersuitelist length ( 2 bytes )
* . . . . . ciphersuitelist
* . . . . . compression methods length ( 1 byte )
* . . . . . compression methods
* . . . . . extensions length ( 2 bytes )
* . . . . . extensions
*/
2014-03-21 08:40:12 +00:00
/*
* DTLS cookie
*/
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_DTLS)
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > transport = = MBEDTLS_SSL_TRANSPORT_DATAGRAM )
2014-03-21 08:40:12 +00:00
{
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 1 ) ;
2014-07-11 00:43:49 +00:00
if ( ssl - > handshake - > verify_cookie = = NULL )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " no verify cookie to send " ) ) ;
2014-07-11 00:43:49 +00:00
* p + + = 0 ;
}
else
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_BUF ( 3 , " client hello, cookie " ,
2014-07-11 00:43:49 +00:00
ssl - > handshake - > verify_cookie ,
ssl - > handshake - > verify_cookie_len ) ;
* p + + = ssl - > handshake - > verify_cookie_len ;
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end ,
ssl - > handshake - > verify_cookie_len ) ;
2014-07-11 00:43:49 +00:00
memcpy ( p , ssl - > handshake - > verify_cookie ,
ssl - > handshake - > verify_cookie_len ) ;
p + = ssl - > handshake - > verify_cookie_len ;
}
2014-03-21 08:40:12 +00:00
}
# endif
/*
* Ciphersuite list
*/
2015-05-04 08:55:58 +00:00
ciphersuites = ssl - > conf - > ciphersuite_list [ ssl - > minor_ver ] ;
2014-03-21 08:40:12 +00:00
/* Skip writing ciphersuite length for now */
2013-06-29 14:01:15 +00:00
n = 0 ;
q = p ;
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 2 ) ;
2013-06-29 14:01:15 +00:00
p + = 2 ;
2009-01-03 21:22:43 +00:00
2013-06-29 14:01:15 +00:00
for ( i = 0 ; ciphersuites [ i ] ! = 0 ; i + + )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
ciphersuite_info = mbedtls_ssl_ciphersuite_from_id ( ciphersuites [ i ] ) ;
2013-06-29 14:01:15 +00:00
2018-04-25 09:06:07 +00:00
if ( ssl_validate_ciphersuite ( ciphersuite_info , ssl ,
ssl - > conf - > min_minor_ver ,
ssl - > conf - > max_minor_ver ) ! = 0 )
2013-06-29 14:01:15 +00:00
continue ;
2019-01-02 11:17:25 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, add ciphersuite: %#04x (%s) " ,
2018-11-07 16:24:35 +00:00
ciphersuites [ i ] , ciphersuite_info - > name ) ) ;
2009-01-03 21:22:43 +00:00
2018-02-14 17:30:48 +00:00
# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
defined ( MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED )
uses_ec | = mbedtls_ssl_ciphersuite_uses_ec ( ciphersuite_info ) ;
# endif
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 2 ) ;
2013-06-29 14:01:15 +00:00
n + + ;
2013-04-15 13:09:54 +00:00
* p + + = ( unsigned char ) ( ciphersuites [ i ] > > 8 ) ;
* p + + = ( unsigned char ) ( ciphersuites [ i ] ) ;
2009-01-03 21:22:43 +00:00
}
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " client hello, got %d ciphersuites (excluding SCSVs) " , n ) ) ;
2017-08-28 10:55:55 +00:00
2015-01-22 10:49:41 +00:00
/*
* Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
*/
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_RENEGOTIATION)
if ( ssl - > renego_status = = MBEDTLS_SSL_INITIAL_HANDSHAKE )
2015-01-22 10:49:41 +00:00
# endif
{
2017-09-10 14:03:50 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " adding EMPTY_RENEGOTIATION_INFO_SCSV " ) ) ;
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 2 ) ;
2015-04-08 10:49:31 +00:00
* p + + = ( unsigned char ) ( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO > > 8 ) ;
* p + + = ( unsigned char ) ( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO ) ;
2015-01-22 10:49:41 +00:00
n + + ;
}
2014-10-20 11:34:59 +00:00
/* Some versions of OpenSSL don't handle it correctly if not at end */
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_FALLBACK_SCSV)
2015-05-06 08:27:31 +00:00
if ( ssl - > conf - > fallback = = MBEDTLS_SSL_IS_FALLBACK )
2014-10-20 11:34:59 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " adding FALLBACK_SCSV " ) ) ;
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 2 ) ;
2015-04-08 10:49:31 +00:00
* p + + = ( unsigned char ) ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE > > 8 ) ;
* p + + = ( unsigned char ) ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) ;
2014-10-20 11:34:59 +00:00
n + + ;
}
# endif
2013-06-29 14:01:15 +00:00
* q + + = ( unsigned char ) ( n > > 7 ) ;
* q + + = ( unsigned char ) ( n < < 1 ) ;
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_ZLIB_SUPPORT)
2014-07-14 15:38:41 +00:00
offer_compress = 1 ;
2012-07-03 13:30:23 +00:00
# else
2014-07-14 15:38:41 +00:00
offer_compress = 0 ;
# endif
2009-01-03 21:22:43 +00:00
2014-07-14 15:38:41 +00:00
/*
2018-01-06 08:46:57 +00:00
* We don ' t support compression with DTLS right now : if many records come
2014-07-14 15:38:41 +00:00
* in the same datagram , uncompressing one could overwrite the next one .
* We don ' t want to add complexity for handling that case unless there is
* an actual need for it .
*/
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_DTLS)
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > transport = = MBEDTLS_SSL_TRANSPORT_DATAGRAM )
2014-07-14 15:38:41 +00:00
offer_compress = 0 ;
# endif
if ( offer_compress )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, compress len.: %d " , 2 ) ) ;
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, compress alg.: %d %d " ,
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_COMPRESS_DEFLATE ,
MBEDTLS_SSL_COMPRESS_NULL ) ) ;
2014-07-14 15:38:41 +00:00
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 3 ) ;
2014-07-14 15:38:41 +00:00
* p + + = 2 ;
2015-04-08 10:49:31 +00:00
* p + + = MBEDTLS_SSL_COMPRESS_DEFLATE ;
* p + + = MBEDTLS_SSL_COMPRESS_NULL ;
2014-07-14 15:38:41 +00:00
}
else
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, compress len.: %d " , 1 ) ) ;
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, compress alg.: %d " ,
MBEDTLS_SSL_COMPRESS_NULL ) ) ;
2014-07-14 15:38:41 +00:00
2017-04-12 13:54:42 +00:00
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 2 ) ;
2014-07-14 15:38:41 +00:00
* p + + = 1 ;
2015-04-08 10:49:31 +00:00
* p + + = MBEDTLS_SSL_COMPRESS_NULL ;
2014-07-14 15:38:41 +00:00
}
2009-01-03 21:22:43 +00:00
2017-04-12 13:54:42 +00:00
/* First write extensions, then the total length */
MBEDTLS_SSL_CHK_BUF_PTR ( p , end , 2 ) ;
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_hostname_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_hostname_ext " , ret ) ;
return ( ret ) ;
}
2013-03-20 15:07:17 +00:00
ext_len + = olen ;
2013-08-27 19:55:01 +00:00
# endif
2009-01-03 21:22:43 +00:00
2017-10-12 13:58:55 +00:00
/* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added
* even if MBEDTLS_SSL_RENEGOTIATION is not defined . */
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_RENEGOTIATION)
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_renegotiation_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_renegotiation_ext " , ret ) ;
return ( ret ) ;
}
2013-03-20 15:07:17 +00:00
ext_len + = olen ;
2014-11-03 07:23:14 +00:00
# endif
2012-04-11 16:11:49 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
2020-03-10 11:19:08 +00:00
defined ( MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED )
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_signature_algorithms_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_signature_algorithms_ext " , ret ) ;
return ( ret ) ;
}
2013-03-20 15:07:17 +00:00
ext_len + = olen ;
2013-08-27 19:19:20 +00:00
# endif
2012-04-11 16:11:49 +00:00
2015-09-15 08:53:51 +00:00
# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
2015-10-06 16:11:18 +00:00
defined ( MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED )
2018-02-14 17:30:48 +00:00
if ( uses_ec )
{
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_supported_elliptic_curves_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_supported_elliptic_curves_ext " , ret ) ;
return ( ret ) ;
}
2018-02-14 17:30:48 +00:00
ext_len + = olen ;
2013-03-20 13:39:14 +00:00
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_supported_point_formats_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_supported_point_formats_ext " , ret ) ;
return ( ret ) ;
}
2018-02-14 17:30:48 +00:00
ext_len + = olen ;
}
2013-03-20 13:39:14 +00:00
# endif
2015-09-16 08:05:04 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_ecjpake_kkpp_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_ecjpake_kkpp_ext " , ret ) ;
return ( ret ) ;
}
2015-09-15 14:55:05 +00:00
ext_len + = olen ;
# endif
2019-05-15 13:03:01 +00:00
# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_cid_ext ( ssl , p + 2 + ext_len , end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_cid_ext " , ret ) ;
return ( ret ) ;
}
2019-04-25 15:55:15 +00:00
ext_len + = olen ;
2019-05-15 13:03:01 +00:00
# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
2019-04-25 15:55:15 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_max_fragment_length_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_max_fragment_length_ext " , ret ) ;
return ( ret ) ;
}
2013-07-16 15:26:28 +00:00
ext_len + = olen ;
2013-08-15 11:33:48 +00:00
# endif
2013-07-16 15:26:28 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_truncated_hmac_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_truncated_hmac_ext " , ret ) ;
return ( ret ) ;
}
2013-07-19 09:41:43 +00:00
ext_len + = olen ;
2013-08-15 11:45:55 +00:00
# endif
2013-07-19 09:41:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_encrypt_then_mac_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_encrypt_then_mac_ext " , ret ) ;
return ( ret ) ;
}
2014-10-27 12:57:03 +00:00
ext_len + = olen ;
# endif
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_extended_ms_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_extended_ms_ext " , ret ) ;
return ( ret ) ;
}
2014-10-20 16:40:56 +00:00
ext_len + = olen ;
# endif
2015-09-29 00:06:06 +00:00
# if defined(MBEDTLS_SSL_ALPN)
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_alpn_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_alpn_ext " , ret ) ;
return ( ret ) ;
}
2013-08-02 12:44:54 +00:00
ext_len + = olen ;
2013-08-14 11:48:06 +00:00
# endif
2013-08-02 12:44:54 +00:00
2015-12-03 20:56:45 +00:00
# if defined(MBEDTLS_SSL_DTLS_SRTP)
2017-12-21 08:15:08 +00:00
if ( ssl - > conf - > transport = = MBEDTLS_SSL_TRANSPORT_DATAGRAM )
{
ssl_write_use_srtp_ext ( ssl , p + 2 + ext_len , & olen ) ;
ext_len + = olen ;
}
2015-12-03 20:56:45 +00:00
# endif
2015-09-29 00:06:06 +00:00
# if defined(MBEDTLS_SSL_SESSION_TICKETS)
2017-04-12 13:54:42 +00:00
if ( ( ret = ssl_write_session_ticket_ext ( ssl , p + 2 + ext_len ,
end , & olen ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_write_session_ticket_ext " , ret ) ;
return ( ret ) ;
}
2014-04-07 08:57:45 +00:00
ext_len + = olen ;
# endif
2014-11-06 01:38:02 +00:00
/* olen unused if all extensions are disabled */
( ( void ) olen ) ;
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " client hello, total extension length: %d " ,
2017-04-12 13:54:42 +00:00
ext_len ) ) ;
2012-04-11 16:11:49 +00:00
2014-04-30 08:15:38 +00:00
if ( ext_len > 0 )
{
2017-04-12 13:54:42 +00:00
/* No need to check for space here, because the extension
* writing functions already took care of that . */
2014-04-30 08:15:38 +00:00
* p + + = ( unsigned char ) ( ( ext_len > > 8 ) & 0xFF ) ;
* p + + = ( unsigned char ) ( ( ext_len ) & 0xFF ) ;
p + = ext_len ;
}
2013-03-20 13:39:14 +00:00
2009-01-03 21:22:43 +00:00
ssl - > out_msglen = p - buf ;
2015-04-08 10:49:31 +00:00
ssl - > out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE ;
ssl - > out_msg [ 0 ] = MBEDTLS_SSL_HS_CLIENT_HELLO ;
2009-01-03 21:22:43 +00:00
ssl - > state + + ;
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_DTLS)
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > transport = = MBEDTLS_SSL_TRANSPORT_DATAGRAM )
2015-04-08 10:49:31 +00:00
mbedtls_ssl_send_flight_completed ( ssl ) ;
2014-09-29 13:29:48 +00:00
# endif
2017-09-13 07:38:11 +00:00
if ( ( ret = mbedtls_ssl_write_handshake_msg ( ssl ) ) ! = 0 )
2009-01-03 21:22:43 +00:00
{
2017-09-13 07:38:11 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_write_handshake_msg " , ret ) ;
2009-01-03 21:22:43 +00:00
return ( ret ) ;
}
2017-09-13 10:45:21 +00:00
# if defined(MBEDTLS_SSL_PROTO_DTLS)
if ( ssl - > conf - > transport = = MBEDTLS_SSL_TRANSPORT_DATAGRAM & &
( ret = mbedtls_ssl_flight_transmit ( ssl ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_flight_transmit " , ret ) ;
return ( ret ) ;
}
2018-08-28 09:13:29 +00:00
# endif /* MBEDTLS_SSL_PROTO_DTLS */
2017-09-13 10:45:21 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= write client hello " ) ) ;
2009-01-03 21:22:43 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
static int ssl_parse_renegotiation_info ( mbedtls_ssl_context * ssl ,
2013-07-19 10:47:00 +00:00
const unsigned char * buf ,
2012-09-16 19:57:18 +00:00
size_t len )
{
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_RENEGOTIATION)
if ( ssl - > renego_status ! = MBEDTLS_SSL_INITIAL_HANDSHAKE )
2012-09-16 19:57:18 +00:00
{
2014-11-03 07:23:14 +00:00
/* Check verify-data in constant-time. The length OTOH is no secret */
if ( len ! = 1 + ssl - > verify_data_len * 2 | |
buf [ 0 ] ! = ssl - > verify_data_len * 2 | |
2015-04-08 10:49:31 +00:00
mbedtls_ssl_safer_memcmp ( buf + 1 ,
2014-11-03 07:23:14 +00:00
ssl - > own_verify_data , ssl - > verify_data_len ) ! = 0 | |
2015-04-08 10:49:31 +00:00
mbedtls_ssl_safer_memcmp ( buf + 1 + ssl - > verify_data_len ,
2014-11-03 07:23:14 +00:00
ssl - > peer_verify_data , ssl - > verify_data_len ) ! = 0 )
2012-09-16 19:57:18 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " non-matching renegotiation info " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2012-09-16 19:57:18 +00:00
}
}
else
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_RENEGOTIATION */
2012-09-16 19:57:18 +00:00
{
2014-11-03 07:23:14 +00:00
if ( len ! = 1 | | buf [ 0 ] ! = 0x00 )
2012-09-16 19:57:18 +00:00
{
2020-06-11 07:34:06 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " non-zero length renegotiation info " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2012-09-16 19:57:18 +00:00
}
2014-11-03 07:23:14 +00:00
2015-04-08 10:49:31 +00:00
ssl - > secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION ;
2012-09-16 19:57:18 +00:00
}
return ( 0 ) ;
}
2013-07-19 09:41:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
static int ssl_parse_max_fragment_length_ext ( mbedtls_ssl_context * ssl ,
2013-07-19 10:47:00 +00:00
const unsigned char * buf ,
2013-07-17 08:14:38 +00:00
size_t len )
{
/*
* server should use the extension only if we did ,
* and if so the server ' s value should match ours ( and len is always 1 )
*/
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > mfl_code = = MBEDTLS_SSL_MAX_FRAG_LEN_NONE | |
2013-07-17 08:14:38 +00:00
len ! = 1 | |
2015-05-04 08:55:58 +00:00
buf [ 0 ] ! = ssl - > conf - > mfl_code )
2013-07-17 08:14:38 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " non-matching max fragment length extension " ) ) ;
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2013-07-17 08:14:38 +00:00
}
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
2012-09-16 19:57:18 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
static int ssl_parse_truncated_hmac_ext ( mbedtls_ssl_context * ssl ,
2013-07-19 09:41:43 +00:00
const unsigned char * buf ,
size_t len )
{
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > trunc_hmac = = MBEDTLS_SSL_TRUNC_HMAC_DISABLED | |
2013-07-19 09:41:43 +00:00
len ! = 0 )
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " non-matching truncated HMAC extension " ) ) ;
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2013-07-19 09:41:43 +00:00
}
( ( void ) buf ) ;
2015-04-08 10:49:31 +00:00
ssl - > session_negotiate - > trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED ;
2013-07-19 09:41:43 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
2013-07-19 09:41:43 +00:00
2019-05-15 13:03:01 +00:00
# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2019-04-26 14:37:26 +00:00
static int ssl_parse_cid_ext ( mbedtls_ssl_context * ssl ,
const unsigned char * buf ,
size_t len )
{
size_t peer_cid_len ;
if ( /* CID extension only makes sense in DTLS */
ssl - > conf - > transport ! = MBEDTLS_SSL_TRANSPORT_DATAGRAM | |
/* The server must only send the CID extension if we have offered it. */
2019-05-03 11:46:59 +00:00
ssl - > negotiate_cid = = MBEDTLS_SSL_CID_DISABLED )
2019-04-26 14:37:26 +00:00
{
2019-05-03 11:46:59 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " CID extension unexpected " ) ) ;
2019-04-26 14:37:26 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
2019-05-03 11:46:59 +00:00
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
}
if ( len = = 0 )
{
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " CID extension invalid " ) ) ;
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2019-04-26 14:37:26 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
}
peer_cid_len = * buf + + ;
len - - ;
if ( peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX )
{
2019-05-03 11:46:59 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " CID extension invalid " ) ) ;
2019-04-26 14:37:26 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
2019-05-03 11:46:59 +00:00
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2019-04-26 14:37:26 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
}
if ( len ! = peer_cid_len )
{
2019-05-03 11:46:59 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " CID extension invalid " ) ) ;
2019-04-26 14:37:26 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
2019-05-03 11:46:59 +00:00
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2019-04-26 14:37:26 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
}
2019-05-03 11:47:49 +00:00
ssl - > handshake - > cid_in_use = MBEDTLS_SSL_CID_ENABLED ;
2019-04-26 14:37:26 +00:00
ssl - > handshake - > peer_cid_len = ( uint8_t ) peer_cid_len ;
memcpy ( ssl - > handshake - > peer_cid , buf , peer_cid_len ) ;
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " Use of CID extension negotiated " ) ) ;
MBEDTLS_SSL_DEBUG_BUF ( 3 , " Server CID " , buf , peer_cid_len ) ;
return ( 0 ) ;
}
2019-05-15 13:03:01 +00:00
# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
2019-04-26 14:37:26 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
static int ssl_parse_encrypt_then_mac_ext ( mbedtls_ssl_context * ssl ,
2014-10-27 12:57:03 +00:00
const unsigned char * buf ,
size_t len )
{
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > encrypt_then_mac = = MBEDTLS_SSL_ETM_DISABLED | |
2015-04-08 10:49:31 +00:00
ssl - > minor_ver = = MBEDTLS_SSL_MINOR_VERSION_0 | |
2014-10-27 12:57:03 +00:00
len ! = 0 )
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " non-matching encrypt-then-MAC extension " ) ) ;
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2014-10-27 12:57:03 +00:00
}
( ( void ) buf ) ;
2015-04-08 10:49:31 +00:00
ssl - > session_negotiate - > encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED ;
2014-10-27 12:57:03 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
2014-10-27 12:57:03 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
static int ssl_parse_extended_ms_ext ( mbedtls_ssl_context * ssl ,
2014-10-20 16:40:56 +00:00
const unsigned char * buf ,
size_t len )
{
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > extended_ms = = MBEDTLS_SSL_EXTENDED_MS_DISABLED | |
2015-04-08 10:49:31 +00:00
ssl - > minor_ver = = MBEDTLS_SSL_MINOR_VERSION_0 | |
2014-10-20 16:40:56 +00:00
len ! = 0 )
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " non-matching extended master secret extension " ) ) ;
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2014-10-20 16:40:56 +00:00
}
( ( void ) buf ) ;
2015-04-08 10:49:31 +00:00
ssl - > handshake - > extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED ;
2014-10-20 16:40:56 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
2014-10-20 16:40:56 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_SESSION_TICKETS)
static int ssl_parse_session_ticket_ext ( mbedtls_ssl_context * ssl ,
2013-08-02 12:44:54 +00:00
const unsigned char * buf ,
size_t len )
{
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > session_tickets = = MBEDTLS_SSL_SESSION_TICKETS_DISABLED | |
2013-08-03 11:02:31 +00:00
len ! = 0 )
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " non-matching session ticket extension " ) ) ;
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2013-08-03 11:02:31 +00:00
}
2013-08-02 12:44:54 +00:00
( ( void ) buf ) ;
2013-07-31 10:58:16 +00:00
ssl - > handshake - > new_session_ticket = 1 ;
2013-08-02 12:44:54 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_SESSION_TICKETS */
2013-08-02 12:44:54 +00:00
2015-10-02 12:34:31 +00:00
# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
2015-10-06 16:11:18 +00:00
defined ( MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED )
2015-04-08 10:49:31 +00:00
static int ssl_parse_supported_point_formats_ext ( mbedtls_ssl_context * ssl ,
2013-08-15 16:01:11 +00:00
const unsigned char * buf ,
size_t len )
{
size_t list_size ;
const unsigned char * p ;
2018-05-30 07:13:21 +00:00
if ( len = = 0 | | ( size_t ) ( buf [ 0 ] + 1 ) ! = len )
2013-08-15 16:01:11 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello message " ) ) ;
2017-05-03 14:28:34 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2013-08-15 16:01:11 +00:00
}
2018-05-30 07:13:21 +00:00
list_size = buf [ 0 ] ;
2013-08-15 16:01:11 +00:00
2014-06-23 12:10:13 +00:00
p = buf + 1 ;
2013-08-15 16:01:11 +00:00
while ( list_size > 0 )
{
2015-04-08 10:49:31 +00:00
if ( p [ 0 ] = = MBEDTLS_ECP_PF_UNCOMPRESSED | |
p [ 0 ] = = MBEDTLS_ECP_PF_COMPRESSED )
2013-08-15 16:01:11 +00:00
{
2015-10-02 12:34:31 +00:00
# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
2013-08-15 17:04:02 +00:00
ssl - > handshake - > ecdh_ctx . point_format = p [ 0 ] ;
2017-05-10 08:46:40 +00:00
# endif
2015-10-06 16:11:18 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2015-10-02 12:34:31 +00:00
ssl - > handshake - > ecjpake_ctx . point_format = p [ 0 ] ;
# endif
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 4 , ( " point format selected: %d " , p [ 0 ] ) ) ;
2013-08-15 16:01:11 +00:00
return ( 0 ) ;
}
list_size - - ;
p + + ;
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " no point format in common " ) ) ;
2017-05-10 14:37:56 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2013-08-15 16:01:11 +00:00
}
2018-03-13 15:22:58 +00:00
# endif / * MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
2015-10-06 16:11:18 +00:00
MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2013-08-15 16:01:11 +00:00
2015-09-16 14:01:00 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
static int ssl_parse_ecjpake_kkpp ( mbedtls_ssl_context * ssl ,
const unsigned char * buf ,
size_t len )
{
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2015-09-16 14:01:00 +00:00
2017-12-27 21:34:08 +00:00
if ( ssl - > handshake - > ciphersuite_info - > key_exchange ! =
2015-09-16 14:01:00 +00:00
MBEDTLS_KEY_EXCHANGE_ECJPAKE )
{
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " skip ecjpake kkpp extension " ) ) ;
return ( 0 ) ;
}
2015-09-17 12:16:30 +00:00
/* If we got here, we no longer need our cached extension */
mbedtls_free ( ssl - > handshake - > ecjpake_cache ) ;
ssl - > handshake - > ecjpake_cache = NULL ;
ssl - > handshake - > ecjpake_cache_len = 0 ;
2015-09-16 14:01:00 +00:00
if ( ( ret = mbedtls_ecjpake_read_round_one ( & ssl - > handshake - > ecjpake_ctx ,
buf , len ) ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ecjpake_read_round_one " , ret ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-09-16 14:01:00 +00:00
return ( ret ) ;
}
return ( 0 ) ;
}
# endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2013-08-15 16:01:11 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_ALPN)
static int ssl_parse_alpn_ext ( mbedtls_ssl_context * ssl ,
2014-04-07 08:57:45 +00:00
const unsigned char * buf , size_t len )
{
size_t list_len , name_len ;
const char * * p ;
/* If we didn't send it, the server shouldn't send it */
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > alpn_list = = NULL )
2017-05-03 14:28:34 +00:00
{
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " non-matching ALPN extension " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2017-05-03 14:28:34 +00:00
}
2014-04-07 08:57:45 +00:00
/*
* opaque ProtocolName < 1. .2 ^ 8 - 1 > ;
*
* struct {
* ProtocolName protocol_name_list < 2. .2 ^ 16 - 1 >
* } ProtocolNameList ;
*
* the " ProtocolNameList " MUST contain exactly one " ProtocolName "
*/
/* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
if ( len < 4 )
2017-05-03 14:28:34 +00:00
{
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2017-05-03 14:28:34 +00:00
}
2014-04-07 08:57:45 +00:00
list_len = ( buf [ 0 ] < < 8 ) | buf [ 1 ] ;
if ( list_len ! = len - 2 )
2017-05-03 14:28:34 +00:00
{
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2017-05-03 14:28:34 +00:00
}
2014-04-07 08:57:45 +00:00
name_len = buf [ 2 ] ;
if ( name_len ! = list_len - 1 )
2017-05-03 14:28:34 +00:00
{
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2017-05-03 14:28:34 +00:00
}
2014-04-07 08:57:45 +00:00
/* Check that the server chosen protocol was in our list and save it */
2015-05-04 08:55:58 +00:00
for ( p = ssl - > conf - > alpn_list ; * p ! = NULL ; p + + )
2014-04-07 08:57:45 +00:00
{
if ( name_len = = strlen ( * p ) & &
memcmp ( buf + 3 , * p , name_len ) = = 0 )
{
ssl - > alpn_chosen = * p ;
return ( 0 ) ;
}
}
2017-05-03 14:28:34 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " ALPN extension: no matching protocol " ) ) ;
2017-05-10 14:37:56 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2014-04-07 08:57:45 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_ALPN */
2014-04-07 08:57:45 +00:00
2015-12-03 20:56:45 +00:00
# if defined(MBEDTLS_SSL_DTLS_SRTP)
static int ssl_parse_use_srtp_ext ( mbedtls_ssl_context * ssl ,
const unsigned char * buf , size_t len )
{
2017-12-21 08:15:08 +00:00
mbedtls_ssl_srtp_profile server_protection = MBEDTLS_SRTP_UNSET_PROFILE ;
2018-01-22 10:30:04 +00:00
size_t i , mki_len = 0 ;
2015-12-03 20:56:45 +00:00
uint16_t server_protection_profile_value = 0 ;
/* If use_srtp is not configured, just ignore the extension */
2017-12-21 08:15:08 +00:00
if ( ( ssl - > conf - > dtls_srtp_profile_list = = NULL ) | | ( ssl - > conf - > dtls_srtp_profile_list_len = = 0 ) )
2015-12-03 20:56:45 +00:00
return ( 0 ) ;
/* RFC5764 section 4.1.1
* uint8 SRTPProtectionProfile [ 2 ] ;
*
* struct {
* SRTPProtectionProfiles SRTPProtectionProfiles ;
* opaque srtp_mki < 0. .255 > ;
* } UseSRTPData ;
* SRTPProtectionProfile SRTPProtectionProfiles < 2. .2 ^ 16 - 1 > ;
*
*/
2018-01-22 10:30:04 +00:00
if ( ssl - > conf - > dtls_srtp_mki_support = = MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED & &
ssl - > dtls_srtp_info . mki_len ! = 0 )
{
mki_len = ssl - > dtls_srtp_info . mki_len ;
}
2015-12-03 20:56:45 +00:00
2018-01-22 10:30:04 +00:00
/* Length is 5 and optional mki_value : one protection profile(2 bytes) + length(2 bytes) and srtp_mki */
if ( ( len ! = 5 ) & & ( len ! = ( 5 + mki_len ) ) )
2015-12-03 20:56:45 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
/*
* get the server protection profile
*/
2018-01-22 10:30:04 +00:00
if ( ( ( uint16_t ) ( ( buf [ 0 ] < < 8 ) | buf [ 1 ] ) ) ! = 0x0002 ) { /* protection profile length must be 0x0002 as we must have only one protection profile in server Hello */
2015-12-03 20:56:45 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
} else {
2018-01-22 10:30:04 +00:00
server_protection_profile_value = ( buf [ 2 ] < < 8 ) | buf [ 3 ] ;
2015-12-03 20:56:45 +00:00
}
2018-01-22 10:30:04 +00:00
ssl - > dtls_srtp_info . chosen_dtls_srtp_profile = MBEDTLS_SRTP_UNSET_PROFILE ;
2015-12-03 20:56:45 +00:00
/*
* Check we have the server profile in our list
*/
2017-12-21 08:15:08 +00:00
for ( i = 0 ; i < ssl - > conf - > dtls_srtp_profile_list_len ; i + + )
2015-12-03 20:56:45 +00:00
{
switch ( server_protection_profile_value ) {
case MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_80_IANA_VALUE :
server_protection = MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_80 ;
break ;
case MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_32_IANA_VALUE :
server_protection = MBEDTLS_SRTP_AES128_CM_HMAC_SHA1_32 ;
break ;
case MBEDTLS_SRTP_NULL_HMAC_SHA1_80_IANA_VALUE :
server_protection = MBEDTLS_SRTP_NULL_HMAC_SHA1_80 ;
break ;
case MBEDTLS_SRTP_NULL_HMAC_SHA1_32_IANA_VALUE :
server_protection = MBEDTLS_SRTP_NULL_HMAC_SHA1_32 ;
break ;
default :
server_protection = MBEDTLS_SRTP_UNSET_PROFILE ;
break ;
}
2017-12-21 08:15:08 +00:00
if ( server_protection = = ssl - > conf - > dtls_srtp_profile_list [ i ] ) {
ssl - > dtls_srtp_info . chosen_dtls_srtp_profile = ssl - > conf - > dtls_srtp_profile_list [ i ] ;
2018-01-22 10:30:04 +00:00
break ;
2015-12-03 20:56:45 +00:00
}
}
2018-01-22 10:30:04 +00:00
/* If no match was found : server problem, it shall never answer with incompatible profile */
if ( ssl - > dtls_srtp_info . chosen_dtls_srtp_profile = = MBEDTLS_SRTP_UNSET_PROFILE )
{
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
}
/* RFC5764:
* If the client detects a nonzero - length MKI in the server ' s response
* that is different than the one the client offered , then the client
* MUST abort the handshake and SHOULD send an invalid_parameter alert .
*/
if ( len > 5 & &
( memcmp ( ssl - > dtls_srtp_info . mki_value , & buf [ 5 ] , mki_len ) ) )
{
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
}
return 0 ;
2015-12-03 20:56:45 +00:00
}
# endif /* MBEDTLS_SSL_DTLS_SRTP */
2014-07-11 00:43:49 +00:00
/*
* Parse HelloVerifyRequest . Only called after verifying the HS type .
*/
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_DTLS)
static int ssl_parse_hello_verify_request ( mbedtls_ssl_context * ssl )
2014-07-11 00:43:49 +00:00
{
2015-04-08 10:49:31 +00:00
const unsigned char * p = ssl - > in_msg + mbedtls_ssl_hs_hdr_len ( ssl ) ;
2014-07-11 00:43:49 +00:00
int major_ver , minor_ver ;
unsigned char cookie_len ;
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " => parse hello verify request " ) ) ;
2014-07-11 00:43:49 +00:00
2019-09-27 12:02:44 +00:00
/* Check that there is enough room for:
* - 2 bytes of version
* - 1 byte of cookie_len
*/
if ( mbedtls_ssl_hs_hdr_len ( ssl ) + 3 > ssl - > in_msglen )
{
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " incoming HelloVerifyRequest message is too short " ) ) ;
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
}
2014-07-11 00:43:49 +00:00
/*
* struct {
* ProtocolVersion server_version ;
* opaque cookie < 0. .2 ^ 8 - 1 > ;
* } HelloVerifyRequest ;
*/
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_BUF ( 3 , " server version " , p , 2 ) ;
2015-05-04 08:55:58 +00:00
mbedtls_ssl_read_version ( & major_ver , & minor_ver , ssl - > conf - > transport , p ) ;
2014-07-11 00:43:49 +00:00
p + = 2 ;
2014-08-09 15:00:46 +00:00
/*
* Since the RFC is not clear on this point , accept DTLS 1.0 ( TLS 1.1 )
* even is lower than our min version .
*/
2015-04-08 10:49:31 +00:00
if ( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 | |
minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 | |
2015-05-04 08:55:58 +00:00
major_ver > ssl - > conf - > max_major_ver | |
minor_ver > ssl - > conf - > max_minor_ver )
2014-07-11 00:43:49 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server version " ) ) ;
2014-07-11 00:43:49 +00:00
2015-04-08 10:49:31 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ) ;
2014-07-11 00:43:49 +00:00
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ) ;
2014-07-11 00:43:49 +00:00
}
cookie_len = * p + + ;
2016-09-26 13:53:05 +00:00
if ( ( ssl - > in_msg + ssl - > in_msglen ) - p < cookie_len )
{
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " cookie length does not match incoming message size " ) ) ;
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
}
2019-09-27 12:00:36 +00:00
MBEDTLS_SSL_DEBUG_BUF ( 3 , " cookie " , p , cookie_len ) ;
2016-09-26 13:53:05 +00:00
2015-04-08 10:49:31 +00:00
mbedtls_free ( ssl - > handshake - > verify_cookie ) ;
2014-07-11 00:43:49 +00:00
2015-05-26 14:04:06 +00:00
ssl - > handshake - > verify_cookie = mbedtls_calloc ( 1 , cookie_len ) ;
2014-07-11 00:43:49 +00:00
if ( ssl - > handshake - > verify_cookie = = NULL )
{
2015-05-27 14:29:56 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " alloc failed (%d bytes) " , cookie_len ) ) ;
2015-05-28 07:33:39 +00:00
return ( MBEDTLS_ERR_SSL_ALLOC_FAILED ) ;
2014-07-11 00:43:49 +00:00
}
memcpy ( ssl - > handshake - > verify_cookie , p , cookie_len ) ;
ssl - > handshake - > verify_cookie_len = cookie_len ;
2014-07-11 11:45:34 +00:00
/* Start over at ClientHello */
2015-04-08 10:49:31 +00:00
ssl - > state = MBEDTLS_SSL_CLIENT_HELLO ;
mbedtls_ssl_reset_checksum ( ssl ) ;
2014-07-11 00:43:49 +00:00
2015-04-08 10:49:31 +00:00
mbedtls_ssl_recv_flight_completed ( ssl ) ;
2014-09-19 13:09:21 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= parse hello verify request " ) ) ;
2014-07-11 00:43:49 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_PROTO_DTLS */
2014-07-11 00:43:49 +00:00
2015-04-08 10:49:31 +00:00
static int ssl_parse_server_hello ( mbedtls_ssl_context * ssl )
2009-01-03 21:22:43 +00:00
{
2014-07-14 15:38:41 +00:00
int ret , i ;
2011-04-24 08:57:21 +00:00
size_t n ;
2014-10-17 15:02:10 +00:00
size_t ext_len ;
2012-09-16 19:57:18 +00:00
unsigned char * buf , * ext ;
2015-06-24 20:28:19 +00:00
unsigned char comp ;
# if defined(MBEDTLS_ZLIB_SUPPORT)
int accept_comp ;
# endif
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_RENEGOTIATION)
2012-09-16 19:57:18 +00:00
int renegotiation_info_seen = 0 ;
2014-11-06 01:38:02 +00:00
# endif
2012-09-17 09:18:12 +00:00
int handshake_failure = 0 ;
2015-04-08 10:49:31 +00:00
const mbedtls_ssl_ciphersuite_t * suite_info ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " => parse server hello " ) ) ;
2009-01-03 21:22:43 +00:00
2018-08-15 12:56:18 +00:00
if ( ( ret = mbedtls_ssl_read_record ( ssl , 1 ) ) ! = 0 )
2009-01-03 21:22:43 +00:00
{
2017-05-03 14:28:34 +00:00
/* No alert on a read error. */
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_read_record " , ret ) ;
2009-01-03 21:22:43 +00:00
return ( ret ) ;
}
2019-05-08 08:38:41 +00:00
buf = ssl - > in_msg ;
2015-04-08 10:49:31 +00:00
if ( ssl - > in_msgtype ! = MBEDTLS_SSL_MSG_HANDSHAKE )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_RENEGOTIATION)
if ( ssl - > renego_status = = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
2014-08-19 10:50:30 +00:00
{
2014-08-19 11:58:40 +00:00
ssl - > renego_records_seen + + ;
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > renego_max_records > = 0 & &
ssl - > renego_records_seen > ssl - > conf - > renego_max_records )
2014-08-19 11:58:40 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " renegotiation requested, but not honored by server " ) ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ) ;
2014-08-19 11:58:40 +00:00
}
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " non-handshake message during renegotiation " ) ) ;
2017-05-24 08:16:26 +00:00
ssl - > keep_current_message = 1 ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO ) ;
2014-08-19 10:50:30 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_RENEGOTIATION */
2014-08-19 10:50:30 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ) ;
2009-01-03 21:22:43 +00:00
}
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_DTLS)
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > transport = = MBEDTLS_SSL_TRANSPORT_DATAGRAM )
2014-07-11 00:43:49 +00:00
{
2015-04-08 10:49:31 +00:00
if ( buf [ 0 ] = = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
2014-07-11 00:43:49 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " received hello verify request " ) ) ;
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= parse server hello " ) ) ;
2014-07-11 00:43:49 +00:00
return ( ssl_parse_hello_verify_request ( ssl ) ) ;
}
else
{
/* We made it through the verification process */
2015-04-08 10:49:31 +00:00
mbedtls_free ( ssl - > handshake - > verify_cookie ) ;
2014-07-11 00:43:49 +00:00
ssl - > handshake - > verify_cookie = NULL ;
ssl - > handshake - > verify_cookie_len = 0 ;
}
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_PROTO_DTLS */
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
if ( ssl - > in_hslen < 38 + mbedtls_ssl_hs_hdr_len ( ssl ) | |
buf [ 0 ] ! = MBEDTLS_SSL_HS_SERVER_HELLO )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello message " ) ) ;
2017-05-03 14:28:34 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2009-01-03 21:22:43 +00:00
}
2014-09-10 19:23:41 +00:00
/*
* 0 . 1 server_version
* 2 . 33 random ( maybe including 4 bytes of Unix time )
* 34 . 34 session_id length = n
* 35 . 34 + n session_id
* 35 + n . 36 + n cipher_suite
* 37 + n . 37 + n compression_method
*
* 38 + n . 39 + n extensions length ( optional )
* 40 + n . . . extensions
*/
2015-04-08 10:49:31 +00:00
buf + = mbedtls_ssl_hs_hdr_len ( ssl ) ;
2014-09-10 19:23:41 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_BUF ( 3 , " server hello, version " , buf + 0 , 2 ) ;
mbedtls_ssl_read_version ( & ssl - > major_ver , & ssl - > minor_ver ,
2015-05-04 08:55:58 +00:00
ssl - > conf - > transport , buf + 0 ) ;
2009-01-03 21:22:43 +00:00
2015-05-04 08:55:58 +00:00
if ( ssl - > major_ver < ssl - > conf - > min_major_ver | |
ssl - > minor_ver < ssl - > conf - > min_minor_ver | |
ssl - > major_ver > ssl - > conf - > max_major_ver | |
ssl - > minor_ver > ssl - > conf - > max_minor_ver )
2012-09-28 13:28:45 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " server version out of bounds - min: [%d:%d], server: [%d:%d], max: [%d:%d] " ,
ssl - > conf - > min_major_ver ,
ssl - > conf - > min_minor_ver ,
ssl - > major_ver , ssl - > minor_ver ,
ssl - > conf - > max_major_ver ,
ssl - > conf - > max_minor_ver ) ) ;
2012-09-28 13:28:45 +00:00
2015-04-08 10:49:31 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ) ;
2012-09-28 13:28:45 +00:00
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ) ;
2012-09-28 13:28:45 +00:00
}
2017-09-06 14:33:34 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " server hello, current time: %lu " ,
( ( uint32_t ) buf [ 2 ] < < 24 ) |
( ( uint32_t ) buf [ 3 ] < < 16 ) |
( ( uint32_t ) buf [ 4 ] < < 8 ) |
( ( uint32_t ) buf [ 5 ] ) ) ) ;
2009-01-03 21:22:43 +00:00
2014-09-10 19:23:41 +00:00
memcpy ( ssl - > handshake - > randbytes + 32 , buf + 2 , 32 ) ;
2009-01-03 21:22:43 +00:00
2014-09-10 19:23:41 +00:00
n = buf [ 34 ] ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_BUF ( 3 , " server hello, random bytes " , buf + 2 , 32 ) ;
2009-01-03 21:22:43 +00:00
2012-09-16 19:57:18 +00:00
if ( n > 32 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello message " ) ) ;
2017-05-03 14:28:34 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2012-09-16 19:57:18 +00:00
}
2015-07-23 10:14:13 +00:00
if ( ssl - > in_hslen > mbedtls_ssl_hs_hdr_len ( ssl ) + 39 + n )
2009-01-03 21:22:43 +00:00
{
2014-09-10 19:23:41 +00:00
ext_len = ( ( buf [ 38 + n ] < < 8 )
| ( buf [ 39 + n ] ) ) ;
2009-01-03 21:22:43 +00:00
2012-09-16 19:57:18 +00:00
if ( ( ext_len > 0 & & ext_len < 4 ) | |
2015-04-08 10:49:31 +00:00
ssl - > in_hslen ! = mbedtls_ssl_hs_hdr_len ( ssl ) + 40 + n + ext_len )
2012-09-16 19:57:18 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2012-09-16 19:57:18 +00:00
}
2009-01-03 21:22:43 +00:00
}
2015-07-23 10:14:13 +00:00
else if ( ssl - > in_hslen = = mbedtls_ssl_hs_hdr_len ( ssl ) + 38 + n )
2014-10-17 15:02:10 +00:00
{
ext_len = 0 ;
}
else
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello message " ) ) ;
2017-05-03 14:28:34 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2014-10-17 15:02:10 +00:00
}
2009-01-03 21:22:43 +00:00
2014-07-14 15:38:41 +00:00
/* ciphersuite (used later) */
2014-09-10 19:23:41 +00:00
i = ( buf [ 35 + n ] < < 8 ) | buf [ 36 + n ] ;
2014-07-14 15:38:41 +00:00
/*
* Read and check compression
*/
2014-09-10 19:23:41 +00:00
comp = buf [ 37 + n ] ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_ZLIB_SUPPORT)
2014-07-14 15:38:41 +00:00
/* See comments in ssl_write_client_hello() */
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_DTLS)
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > transport = = MBEDTLS_SSL_TRANSPORT_DATAGRAM )
2014-07-14 15:38:41 +00:00
accept_comp = 0 ;
2015-06-24 20:28:19 +00:00
else
2014-07-14 15:38:41 +00:00
# endif
2015-06-24 20:28:19 +00:00
accept_comp = 1 ;
2014-07-14 15:38:41 +00:00
2015-06-24 20:28:19 +00:00
if ( comp ! = MBEDTLS_SSL_COMPRESS_NULL & &
( comp ! = MBEDTLS_SSL_COMPRESS_DEFLATE | | accept_comp = = 0 ) )
# else /* MBEDTLS_ZLIB_SUPPORT */
if ( comp ! = MBEDTLS_SSL_COMPRESS_NULL )
# endif /* MBEDTLS_ZLIB_SUPPORT */
2014-07-14 15:38:41 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " server hello, bad compression: %d " , comp ) ) ;
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ) ;
2014-07-14 15:38:41 +00:00
}
2012-04-18 16:10:25 +00:00
/*
* Initialize update checksum functions
*/
2017-12-27 21:34:08 +00:00
ssl - > handshake - > ciphersuite_info = mbedtls_ssl_ciphersuite_from_id ( i ) ;
if ( ssl - > handshake - > ciphersuite_info = = NULL )
2013-01-07 17:20:04 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " ciphersuite info for %04x not found " , i ) ) ;
2017-05-03 14:28:34 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ) ;
2013-01-07 17:20:04 +00:00
}
2012-04-18 16:10:25 +00:00
2017-12-27 21:34:08 +00:00
mbedtls_ssl_optimize_checksum ( ssl , ssl - > handshake - > ciphersuite_info ) ;
2014-03-10 12:25:07 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " server hello, session id len.: %d " , n ) ) ;
MBEDTLS_SSL_DEBUG_BUF ( 3 , " server hello, session id " , buf + 35 , n ) ;
2009-01-03 21:22:43 +00:00
/*
* Check if the session can be resumed
*/
2014-11-03 07:23:14 +00:00
if ( ssl - > handshake - > resume = = 0 | | n = = 0 | |
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_RENEGOTIATION)
ssl - > renego_status ! = MBEDTLS_SSL_INITIAL_HANDSHAKE | |
2014-11-03 07:23:14 +00:00
# endif
2012-09-16 19:57:18 +00:00
ssl - > session_negotiate - > ciphersuite ! = i | |
ssl - > session_negotiate - > compression ! = comp | |
2015-06-18 13:50:37 +00:00
ssl - > session_negotiate - > id_len ! = n | |
2014-09-10 19:23:41 +00:00
memcmp ( ssl - > session_negotiate - > id , buf + 35 , n ) ! = 0 )
2009-01-03 21:22:43 +00:00
{
ssl - > state + + ;
2012-09-25 21:55:46 +00:00
ssl - > handshake - > resume = 0 ;
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_HAVE_TIME)
2016-04-26 06:43:27 +00:00
ssl - > session_negotiate - > start = mbedtls_time ( NULL ) ;
2013-07-03 13:31:03 +00:00
# endif
2012-09-16 19:57:18 +00:00
ssl - > session_negotiate - > ciphersuite = i ;
ssl - > session_negotiate - > compression = comp ;
2015-06-18 13:50:37 +00:00
ssl - > session_negotiate - > id_len = n ;
2014-09-10 19:23:41 +00:00
memcpy ( ssl - > session_negotiate - > id , buf + 35 , n ) ;
2009-01-03 21:22:43 +00:00
}
else
{
2015-04-08 10:49:31 +00:00
ssl - > state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC ;
2010-03-16 21:09:09 +00:00
2015-04-08 10:49:31 +00:00
if ( ( ret = mbedtls_ssl_derive_keys ( ssl ) ) ! = 0 )
2010-03-16 21:09:09 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_derive_keys " , ret ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ) ;
2010-03-16 21:09:09 +00:00
return ( ret ) ;
}
2009-01-03 21:22:43 +00:00
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " %s session has been resumed " ,
2012-09-25 21:55:46 +00:00
ssl - > handshake - > resume ? " a " : " no " ) ) ;
2009-01-03 21:22:43 +00:00
2015-09-16 09:13:41 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " server hello, chosen ciphersuite: %04x " , i ) ) ;
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " server hello, compress alg.: %d " ,
buf [ 37 + n ] ) ) ;
2009-01-03 21:22:43 +00:00
2018-04-25 09:06:07 +00:00
/*
* Perform cipher suite validation in same way as in ssl_write_client_hello .
2018-04-18 18:35:00 +00:00
*/
2009-01-03 21:22:43 +00:00
i = 0 ;
while ( 1 )
{
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > ciphersuite_list [ ssl - > minor_ver ] [ i ] = = 0 )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2009-01-03 21:22:43 +00:00
}
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > ciphersuite_list [ ssl - > minor_ver ] [ i + + ] = =
2013-04-15 13:09:54 +00:00
ssl - > session_negotiate - > ciphersuite )
{
2009-01-03 21:22:43 +00:00
break ;
2013-04-15 13:09:54 +00:00
}
2009-01-03 21:22:43 +00:00
}
2017-05-08 10:06:19 +00:00
suite_info = mbedtls_ssl_ciphersuite_from_id (
ssl - > session_negotiate - > ciphersuite ) ;
if ( ssl_validate_ciphersuite ( suite_info , ssl , ssl - > minor_ver ,
ssl - > minor_ver ) ! = 0 )
2018-04-18 18:35:00 +00:00
{
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2018-04-18 18:35:00 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
}
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " server hello, chosen ciphersuite: %s " , suite_info - > name ) ) ;
2018-04-18 18:35:00 +00:00
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2018-06-12 10:40:54 +00:00
if ( suite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA & &
ssl - > minor_ver = = MBEDTLS_SSL_MINOR_VERSION_3 )
{
ssl - > handshake - > ecrs_enabled = 1 ;
}
# endif
2015-04-08 10:49:31 +00:00
if ( comp ! = MBEDTLS_SSL_COMPRESS_NULL
# if defined(MBEDTLS_ZLIB_SUPPORT)
& & comp ! = MBEDTLS_SSL_COMPRESS_DEFLATE
2012-07-03 13:30:23 +00:00
# endif
)
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2009-01-03 21:22:43 +00:00
}
2012-09-16 19:57:18 +00:00
ssl - > session_negotiate - > compression = comp ;
2014-09-10 19:23:41 +00:00
ext = buf + 40 + n ;
2012-09-16 19:57:18 +00:00
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 ,
( " server hello, total extension length: %d " , ext_len ) ) ;
2013-07-16 15:26:28 +00:00
2012-09-16 19:57:18 +00:00
while ( ext_len )
{
unsigned int ext_id = ( ( ext [ 0 ] < < 8 )
| ( ext [ 1 ] ) ) ;
unsigned int ext_size = ( ( ext [ 2 ] < < 8 )
| ( ext [ 3 ] ) ) ;
if ( ext_size + 4 > ext_len )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2012-09-16 19:57:18 +00:00
}
switch ( ext_id )
{
2015-04-08 10:49:31 +00:00
case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO :
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " found renegotiation extension " ) ) ;
# if defined(MBEDTLS_SSL_RENEGOTIATION)
2012-09-16 19:57:18 +00:00
renegotiation_info_seen = 1 ;
2014-11-06 01:38:02 +00:00
# endif
2012-09-16 19:57:18 +00:00
2014-05-01 12:18:25 +00:00
if ( ( ret = ssl_parse_renegotiation_info ( ssl , ext + 4 ,
ext_size ) ) ! = 0 )
2012-09-16 19:57:18 +00:00
return ( ret ) ;
break ;
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH :
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " found max_fragment_length extension " ) ) ;
2013-07-17 08:14:38 +00:00
if ( ( ret = ssl_parse_max_fragment_length_ext ( ssl ,
ext + 4 , ext_size ) ) ! = 0 )
{
return ( ret ) ;
}
break ;
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
2013-07-17 08:14:38 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
case MBEDTLS_TLS_EXT_TRUNCATED_HMAC :
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " found truncated_hmac extension " ) ) ;
2013-07-19 09:41:43 +00:00
if ( ( ret = ssl_parse_truncated_hmac_ext ( ssl ,
ext + 4 , ext_size ) ) ! = 0 )
{
return ( ret ) ;
}
break ;
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
2013-07-19 09:41:43 +00:00
2019-05-15 13:03:01 +00:00
# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2019-04-26 14:37:26 +00:00
case MBEDTLS_TLS_EXT_CID :
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " found CID extension " ) ) ;
if ( ( ret = ssl_parse_cid_ext ( ssl ,
ext + 4 ,
ext_size ) ) ! = 0 )
{
return ( ret ) ;
}
break ;
2019-05-15 13:03:01 +00:00
# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
2019-04-26 14:37:26 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC :
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " found encrypt_then_mac extension " ) ) ;
2014-10-27 12:57:03 +00:00
if ( ( ret = ssl_parse_encrypt_then_mac_ext ( ssl ,
ext + 4 , ext_size ) ) ! = 0 )
{
return ( ret ) ;
}
break ;
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
2014-10-27 12:57:03 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET :
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " found extended_master_secret extension " ) ) ;
2014-10-20 16:40:56 +00:00
if ( ( ret = ssl_parse_extended_ms_ext ( ssl ,
ext + 4 , ext_size ) ) ! = 0 )
{
return ( ret ) ;
}
break ;
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
2014-10-20 16:40:56 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_SESSION_TICKETS)
case MBEDTLS_TLS_EXT_SESSION_TICKET :
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " found session_ticket extension " ) ) ;
2013-08-02 12:44:54 +00:00
if ( ( ret = ssl_parse_session_ticket_ext ( ssl ,
ext + 4 , ext_size ) ) ! = 0 )
{
return ( ret ) ;
}
break ;
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_SESSION_TICKETS */
2013-08-02 12:44:54 +00:00
2015-10-02 12:34:31 +00:00
# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
2015-10-06 16:11:18 +00:00
defined ( MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED )
2015-04-08 10:49:31 +00:00
case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS :
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " found supported_point_formats extension " ) ) ;
2013-08-15 16:01:11 +00:00
if ( ( ret = ssl_parse_supported_point_formats_ext ( ssl ,
ext + 4 , ext_size ) ) ! = 0 )
{
return ( ret ) ;
}
break ;
2015-10-06 16:11:18 +00:00
# endif / * MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2013-08-15 16:01:11 +00:00
2015-09-16 14:01:00 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
case MBEDTLS_TLS_EXT_ECJPAKE_KKPP :
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " found ecjpake_kkpp extension " ) ) ;
if ( ( ret = ssl_parse_ecjpake_kkpp ( ssl ,
ext + 4 , ext_size ) ) ! = 0 )
{
return ( ret ) ;
}
break ;
# endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2013-08-15 16:01:11 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_ALPN)
case MBEDTLS_TLS_EXT_ALPN :
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " found alpn extension " ) ) ;
2014-04-07 08:57:45 +00:00
if ( ( ret = ssl_parse_alpn_ext ( ssl , ext + 4 , ext_size ) ) ! = 0 )
return ( ret ) ;
break ;
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_ALPN */
2014-04-07 08:57:45 +00:00
2015-12-03 20:56:45 +00:00
# if defined(MBEDTLS_SSL_DTLS_SRTP)
case MBEDTLS_TLS_EXT_USE_SRTP :
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " found use_srtp extension " ) ) ;
if ( ( ret = ssl_parse_use_srtp_ext ( ssl , ext + 4 , ext_size ) ) ! = 0 )
return ( ret ) ;
break ;
# endif /* MBEDTLS_SSL_DTLS_SRTP */
2012-09-16 19:57:18 +00:00
default :
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " unknown extension found: %d (ignoring) " , ext_id ) ) ;
2012-09-16 19:57:18 +00:00
}
ext_len - = 4 + ext_size ;
ext + = 4 + ext_size ;
if ( ext_len > 0 & & ext_len < 4 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello message " ) ) ;
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2012-09-16 19:57:18 +00:00
}
}
/*
* Renegotiation security checks
*/
2015-04-08 10:49:31 +00:00
if ( ssl - > secure_renegotiation = = MBEDTLS_SSL_LEGACY_RENEGOTIATION & &
2017-05-08 10:06:19 +00:00
ssl - > conf - > allow_legacy_renegotiation = =
MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
2012-09-16 19:57:18 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " legacy renegotiation, breaking off handshake " ) ) ;
2012-09-17 09:18:12 +00:00
handshake_failure = 1 ;
2013-04-16 11:15:56 +00:00
}
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_RENEGOTIATION)
else if ( ssl - > renego_status = = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS & &
ssl - > secure_renegotiation = = MBEDTLS_SSL_SECURE_RENEGOTIATION & &
2012-09-17 09:18:12 +00:00
renegotiation_info_seen = = 0 )
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " renegotiation_info extension missing (secure) " ) ) ;
2012-09-17 09:18:12 +00:00
handshake_failure = 1 ;
2012-09-16 19:57:18 +00:00
}
2015-04-08 10:49:31 +00:00
else if ( ssl - > renego_status = = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS & &
ssl - > secure_renegotiation = = MBEDTLS_SSL_LEGACY_RENEGOTIATION & &
2017-05-08 10:06:19 +00:00
ssl - > conf - > allow_legacy_renegotiation = =
MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
2012-09-16 19:57:18 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " legacy renegotiation not allowed " ) ) ;
2012-09-17 09:18:12 +00:00
handshake_failure = 1 ;
}
2015-04-08 10:49:31 +00:00
else if ( ssl - > renego_status = = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS & &
ssl - > secure_renegotiation = = MBEDTLS_SSL_LEGACY_RENEGOTIATION & &
2012-09-17 09:18:12 +00:00
renegotiation_info_seen = = 1 )
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " renegotiation_info extension present (legacy) " ) ) ;
2012-09-17 09:18:12 +00:00
handshake_failure = 1 ;
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_RENEGOTIATION */
2012-09-17 09:18:12 +00:00
if ( handshake_failure = = 1 )
{
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ) ;
2012-09-16 19:57:18 +00:00
}
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= parse server hello " ) ) ;
2009-01-03 21:22:43 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
defined ( MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED )
2017-05-08 10:06:19 +00:00
static int ssl_parse_server_dh_params ( mbedtls_ssl_context * ssl ,
unsigned char * * p ,
2013-04-16 11:07:56 +00:00
unsigned char * end )
{
2015-04-08 10:49:31 +00:00
int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ;
2013-04-16 11:07:56 +00:00
/*
* Ephemeral DH parameters :
*
* struct {
* opaque dh_p < 1. .2 ^ 16 - 1 > ;
* opaque dh_g < 1. .2 ^ 16 - 1 > ;
* opaque dh_Ys < 1. .2 ^ 16 - 1 > ;
* } ServerDHParams ;
*/
2017-05-08 10:06:19 +00:00
if ( ( ret = mbedtls_dhm_read_params ( & ssl - > handshake - > dhm_ctx ,
p , end ) ) ! = 0 )
2013-04-16 11:07:56 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 2 , ( " mbedtls_dhm_read_params " ) , ret ) ;
2013-04-16 11:07:56 +00:00
return ( ret ) ;
}
2015-06-11 12:49:42 +00:00
if ( ssl - > handshake - > dhm_ctx . len * 8 < ssl - > conf - > dhm_min_bitlen )
2013-04-16 11:07:56 +00:00
{
2015-06-11 12:49:42 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " DHM prime too short: %d < %d " ,
ssl - > handshake - > dhm_ctx . len * 8 ,
ssl - > conf - > dhm_min_bitlen ) ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-04-16 11:07:56 +00:00
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MPI ( 3 , " DHM: P " , & ssl - > handshake - > dhm_ctx . P ) ;
MBEDTLS_SSL_DEBUG_MPI ( 3 , " DHM: G " , & ssl - > handshake - > dhm_ctx . G ) ;
MBEDTLS_SSL_DEBUG_MPI ( 3 , " DHM: GY " , & ssl - > handshake - > dhm_ctx . GY ) ;
2013-04-16 11:07:56 +00:00
return ( ret ) ;
}
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
# if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) | | \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ) | | \
defined ( MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ) | | \
defined ( MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED )
static int ssl_check_server_ecdh_params ( const mbedtls_ssl_context * ssl )
2013-12-11 16:45:46 +00:00
{
2015-04-08 10:49:31 +00:00
const mbedtls_ecp_curve_info * curve_info ;
2019-01-31 13:20:20 +00:00
mbedtls_ecp_group_id grp_id ;
# if defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
grp_id = ssl - > handshake - > ecdh_ctx . grp . id ;
# else
grp_id = ssl - > handshake - > ecdh_ctx . grp_id ;
# endif
2014-02-06 09:13:09 +00:00
2019-01-31 13:20:20 +00:00
curve_info = mbedtls_ecp_curve_info_from_grp_id ( grp_id ) ;
2014-02-06 09:13:09 +00:00
if ( curve_info = = NULL )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2014-02-06 09:13:09 +00:00
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " ECDH curve: %s " , curve_info - > name ) ) ;
2013-12-11 16:45:46 +00:00
2015-06-17 09:43:30 +00:00
# if defined(MBEDTLS_ECP_C)
2019-01-31 13:20:20 +00:00
if ( mbedtls_ssl_check_curve ( ssl , grp_id ) ! = 0 )
2014-02-04 15:18:07 +00:00
# else
2013-12-11 16:45:46 +00:00
if ( ssl - > handshake - > ecdh_ctx . grp . nbits < 163 | |
ssl - > handshake - > ecdh_ctx . grp . nbits > 521 )
2014-02-04 15:18:07 +00:00
# endif
2013-12-11 16:45:46 +00:00
return ( - 1 ) ;
2019-01-31 13:20:20 +00:00
MBEDTLS_SSL_DEBUG_ECDH ( 3 , & ssl - > handshake - > ecdh_ctx ,
MBEDTLS_DEBUG_ECDH_QP ) ;
2013-12-11 16:45:46 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED | |
MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED | |
MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED | |
MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
2019-01-08 12:54:37 +00:00
# if defined(MBEDTLS_USE_PSA_CRYPTO) && \
( defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ) | | \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) )
static int ssl_parse_server_ecdh_params_psa ( mbedtls_ssl_context * ssl ,
unsigned char * * p ,
unsigned char * end )
{
uint16_t tls_id ;
2019-12-19 12:31:53 +00:00
size_t ecdh_bits = 0 ;
2019-01-08 12:54:37 +00:00
uint8_t ecpoint_len ;
mbedtls_ssl_handshake_params * handshake = ssl - > handshake ;
/*
* Parse ECC group
*/
if ( end - * p < 4 )
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
/* First byte is curve_type; only named_curve is handled */
if ( * ( * p ) + + ! = MBEDTLS_ECP_TLS_NAMED_CURVE )
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
/* Next two bytes are the namedcurve value */
tls_id = * ( * p ) + + ;
tls_id < < = 8 ;
tls_id | = * ( * p ) + + ;
/* Convert EC group to PSA key type. */
2019-12-19 12:31:53 +00:00
if ( ( handshake - > ecdh_psa_type =
mbedtls_psa_parse_tls_ecc_group ( tls_id , & ecdh_bits ) ) = = 0 )
2019-01-08 12:54:37 +00:00
{
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
}
2019-12-19 12:31:53 +00:00
if ( ecdh_bits > 0xffff )
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
handshake - > ecdh_bits = ( uint16_t ) ecdh_bits ;
2019-01-08 12:54:37 +00:00
/*
* Put peer ' s ECDH public key in the format understood by PSA .
*/
ecpoint_len = * ( * p ) + + ;
if ( ( size_t ) ( end - * p ) < ecpoint_len )
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2019-12-19 12:31:53 +00:00
if ( mbedtls_psa_tls_ecpoint_to_psa_ec (
2019-01-08 12:54:37 +00:00
* p , ecpoint_len ,
handshake - > ecdh_psa_peerkey ,
sizeof ( handshake - > ecdh_psa_peerkey ) ,
& handshake - > ecdh_psa_peerkey_len ) ! = 0 )
{
return ( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ) ;
}
* p + = ecpoint_len ;
return ( 0 ) ;
}
# endif / * MBEDTLS_USE_PSA_CRYPTO &&
( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED | |
MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) | | \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED )
static int ssl_parse_server_ecdh_params ( mbedtls_ssl_context * ssl ,
2013-04-16 11:07:56 +00:00
unsigned char * * p ,
unsigned char * end )
{
2015-04-08 10:49:31 +00:00
int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ;
2013-04-16 11:07:56 +00:00
/*
* Ephemeral ECDH parameters :
*
* struct {
* ECParameters curve_params ;
* ECPoint public ;
* } ServerECDHParams ;
*/
2015-04-08 10:49:31 +00:00
if ( ( ret = mbedtls_ecdh_read_params ( & ssl - > handshake - > ecdh_ctx ,
2013-04-16 11:07:56 +00:00
( const unsigned char * * ) p , end ) ) ! = 0 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , ( " mbedtls_ecdh_read_params " ) , ret ) ;
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2018-09-12 08:34:43 +00:00
if ( ret = = MBEDTLS_ERR_ECP_IN_PROGRESS )
ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS ;
2018-06-13 10:02:12 +00:00
# endif
2013-04-16 11:07:56 +00:00
return ( ret ) ;
}
2013-12-11 16:45:46 +00:00
if ( ssl_check_server_ecdh_params ( ssl ) ! = 0 )
2013-04-16 11:07:56 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " bad server key exchange message (ECDHE curve) " ) ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-04-16 11:07:56 +00:00
}
return ( ret ) ;
}
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED | |
MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
2013-04-16 11:07:56 +00:00
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
2015-04-08 10:49:31 +00:00
static int ssl_parse_server_psk_hint ( mbedtls_ssl_context * ssl ,
2013-04-16 16:05:29 +00:00
unsigned char * * p ,
unsigned char * end )
{
2015-04-08 10:49:31 +00:00
int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ;
2019-09-21 15:51:25 +00:00
uint16_t len ;
2013-06-26 13:08:35 +00:00
( ( void ) ssl ) ;
2013-04-16 16:05:29 +00:00
/*
* PSK parameters :
*
* opaque psk_identity_hint < 0. .2 ^ 16 - 1 > ;
*/
2018-10-08 12:40:50 +00:00
if ( end - ( * p ) < 2 )
2018-03-13 10:31:14 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " bad server key exchange message (psk_identity_hint length) " ) ) ;
2018-03-13 10:31:14 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
}
2013-10-15 09:55:33 +00:00
len = ( * p ) [ 0 ] < < 8 | ( * p ) [ 1 ] ;
2013-04-19 12:30:58 +00:00
* p + = 2 ;
2013-04-16 16:05:29 +00:00
2019-09-21 15:51:25 +00:00
if ( end - ( * p ) < len )
2013-04-16 16:05:29 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " bad server key exchange message (psk_identity_hint length) " ) ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-04-16 16:05:29 +00:00
}
2016-02-22 10:10:14 +00:00
/*
* Note : we currently ignore the PKS identity hint , as we only allow one
* PSK to be provisionned on the client . This could be changed later if
* someone needs that feature .
*/
2013-04-16 16:05:29 +00:00
* p + = len ;
2013-04-19 12:30:58 +00:00
ret = 0 ;
2013-04-16 16:05:29 +00:00
return ( ret ) ;
}
2020-03-10 11:19:08 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
2013-04-16 16:05:29 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
defined ( MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED )
2013-10-14 15:39:48 +00:00
/*
* Generate a pre - master secret and encrypt it with the server ' s RSA key
*/
2015-04-08 10:49:31 +00:00
static int ssl_write_encrypted_pms ( mbedtls_ssl_context * ssl ,
2013-10-14 15:39:48 +00:00
size_t offset , size_t * olen ,
size_t pms_offset )
{
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2015-04-08 10:49:31 +00:00
size_t len_bytes = ssl - > minor_ver = = MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2 ;
2013-10-14 15:39:48 +00:00
unsigned char * p = ssl - > handshake - > premaster + pms_offset ;
2019-02-06 16:49:54 +00:00
mbedtls_pk_context * peer_pk ;
2013-10-14 15:39:48 +00:00
2016-05-25 10:56:48 +00:00
if ( offset + len_bytes > MBEDTLS_SSL_OUT_CONTENT_LEN )
2015-08-27 14:37:35 +00:00
{
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " buffer too small for encrypted pms " ) ) ;
return ( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ) ;
}
2013-10-14 15:39:48 +00:00
/*
* Generate ( part of ) the pre - master as
* struct {
* ProtocolVersion client_version ;
* opaque random [ 46 ] ;
* } PreMasterSecret ;
*/
2017-05-08 10:06:19 +00:00
mbedtls_ssl_write_version ( ssl - > conf - > max_major_ver ,
ssl - > conf - > max_minor_ver ,
ssl - > conf - > transport , p ) ;
2013-10-14 15:39:48 +00:00
2015-05-07 11:35:38 +00:00
if ( ( ret = ssl - > conf - > f_rng ( ssl - > conf - > p_rng , p + 2 , 46 ) ) ! = 0 )
2013-10-14 15:39:48 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " f_rng " , ret ) ;
2013-10-14 15:39:48 +00:00
return ( ret ) ;
}
ssl - > handshake - > pmslen = 48 ;
2019-02-06 16:49:54 +00:00
# if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
peer_pk = & ssl - > handshake - > peer_pubkey ;
# else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2015-09-03 08:44:32 +00:00
if ( ssl - > session_negotiate - > peer_cert = = NULL )
{
2019-02-06 17:37:32 +00:00
/* Should never happen */
2019-02-26 11:51:06 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
2019-02-06 17:37:32 +00:00
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2015-09-03 08:44:32 +00:00
}
2019-02-06 16:49:54 +00:00
peer_pk = & ssl - > session_negotiate - > peer_cert - > pk ;
# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2015-09-03 08:44:32 +00:00
2013-10-14 15:39:48 +00:00
/*
* Now write it out , encrypted
*/
2019-02-06 16:49:54 +00:00
if ( ! mbedtls_pk_can_do ( peer_pk , MBEDTLS_PK_RSA ) )
2013-10-14 15:39:48 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " certificate key type mismatch " ) ) ;
return ( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ) ;
2013-10-14 15:39:48 +00:00
}
2019-02-06 16:49:54 +00:00
if ( ( ret = mbedtls_pk_encrypt ( peer_pk ,
2013-10-14 15:39:48 +00:00
p , ssl - > handshake - > pmslen ,
ssl - > out_msg + offset + len_bytes , olen ,
2016-05-25 10:56:48 +00:00
MBEDTLS_SSL_OUT_CONTENT_LEN - offset - len_bytes ,
2015-05-07 11:35:38 +00:00
ssl - > conf - > f_rng , ssl - > conf - > p_rng ) ) ! = 0 )
2013-10-14 15:39:48 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_rsa_pkcs1_encrypt " , ret ) ;
2013-10-14 15:39:48 +00:00
return ( ret ) ;
}
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
defined ( MBEDTLS_SSL_PROTO_TLS1_2 )
2013-10-14 15:39:48 +00:00
if ( len_bytes = = 2 )
{
ssl - > out_msg [ offset + 0 ] = ( unsigned char ) ( * olen > > 8 ) ;
ssl - > out_msg [ offset + 1 ] = ( unsigned char ) ( * olen ) ;
* olen + = 2 ;
}
# endif
2019-02-08 14:06:00 +00:00
# if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
/* We don't need the peer's public key anymore. Free it. */
mbedtls_pk_free ( peer_pk ) ;
# endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2013-10-14 15:39:48 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2015-10-23 06:48:41 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ) | | \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED )
2015-04-08 10:49:31 +00:00
static int ssl_parse_signature_algorithm ( mbedtls_ssl_context * ssl ,
2013-04-16 11:07:56 +00:00
unsigned char * * p ,
unsigned char * end ,
2015-04-08 10:49:31 +00:00
mbedtls_md_type_t * md_alg ,
mbedtls_pk_type_t * pk_alg )
2013-04-16 11:07:56 +00:00
{
2013-06-26 13:08:35 +00:00
( ( void ) ssl ) ;
2015-04-08 10:49:31 +00:00
* md_alg = MBEDTLS_MD_NONE ;
* pk_alg = MBEDTLS_PK_NONE ;
2013-04-16 11:07:56 +00:00
2013-08-19 10:06:38 +00:00
/* Only in TLS 1.2 */
2015-04-08 10:49:31 +00:00
if ( ssl - > minor_ver ! = MBEDTLS_SSL_MINOR_VERSION_3 )
2013-04-16 11:07:56 +00:00
{
2013-08-19 10:06:38 +00:00
return ( 0 ) ;
2013-04-16 11:07:56 +00:00
}
2013-04-19 12:30:58 +00:00
if ( ( * p ) + 2 > end )
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-04-16 11:07:56 +00:00
2013-08-19 10:06:38 +00:00
/*
* Get hash algorithm
*/
2017-05-08 10:06:19 +00:00
if ( ( * md_alg = mbedtls_ssl_md_alg_from_hash ( ( * p ) [ 0 ] ) )
= = MBEDTLS_MD_NONE )
2013-04-16 11:07:56 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " Server used unsupported HashAlgorithm %d " , * ( p ) [ 0 ] ) ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-04-16 11:07:56 +00:00
}
2013-08-19 10:06:38 +00:00
/*
* Get signature algorithm
*/
2017-05-08 10:06:19 +00:00
if ( ( * pk_alg = mbedtls_ssl_pk_alg_from_sig ( ( * p ) [ 1 ] ) )
= = MBEDTLS_PK_NONE )
2013-04-16 11:07:56 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " server used unsupported SignatureAlgorithm %d " , ( * p ) [ 1 ] ) ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-04-16 11:07:56 +00:00
}
2015-06-17 12:34:48 +00:00
/*
* Check if the hash is acceptable
*/
if ( mbedtls_ssl_check_sig_hash ( ssl , * md_alg ) ! = 0 )
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " server used HashAlgorithm %d that was not offered " , * ( p ) [ 0 ] ) ) ;
2015-06-17 12:34:48 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
}
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " Server used SignatureAlgorithm %d " ,
( * p ) [ 1 ] ) ) ;
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " Server used HashAlgorithm %d " ,
( * p ) [ 0 ] ) ) ;
2013-04-16 11:07:56 +00:00
* p + = 2 ;
return ( 0 ) ;
}
2015-10-23 06:48:41 +00:00
# endif / * MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED | |
MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2013-04-16 11:07:56 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
defined ( MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED )
static int ssl_get_ecdh_params_from_cert ( mbedtls_ssl_context * ssl )
2013-12-11 16:45:46 +00:00
{
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2015-04-08 10:49:31 +00:00
const mbedtls_ecp_keypair * peer_key ;
2019-02-06 17:44:07 +00:00
mbedtls_pk_context * peer_pk ;
2013-12-11 16:45:46 +00:00
2019-02-06 17:44:07 +00:00
# if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
peer_pk = & ssl - > handshake - > peer_pubkey ;
# else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2015-09-03 08:44:32 +00:00
if ( ssl - > session_negotiate - > peer_cert = = NULL )
{
2019-02-06 17:37:32 +00:00
/* Should never happen */
2019-02-26 12:36:01 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
2019-02-06 17:37:32 +00:00
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2015-09-03 08:44:32 +00:00
}
2019-02-06 17:44:07 +00:00
peer_pk = & ssl - > session_negotiate - > peer_cert - > pk ;
# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2015-09-03 08:44:32 +00:00
2019-02-06 17:44:07 +00:00
if ( ! mbedtls_pk_can_do ( peer_pk , MBEDTLS_PK_ECKEY ) )
2013-12-11 16:45:46 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " server key not ECDH capable " ) ) ;
return ( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ) ;
2013-12-11 16:45:46 +00:00
}
2019-02-06 17:44:07 +00:00
peer_key = mbedtls_pk_ec ( * peer_pk ) ;
2013-12-11 16:45:46 +00:00
2015-04-08 10:49:31 +00:00
if ( ( ret = mbedtls_ecdh_get_params ( & ssl - > handshake - > ecdh_ctx , peer_key ,
MBEDTLS_ECDH_THEIRS ) ) ! = 0 )
2013-12-11 16:45:46 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , ( " mbedtls_ecdh_get_params " ) , ret ) ;
2013-12-11 16:45:46 +00:00
return ( ret ) ;
}
if ( ssl_check_server_ecdh_params ( ssl ) ! = 0 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server certificate (ECDH curve) " ) ) ;
return ( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ) ;
2013-12-11 16:45:46 +00:00
}
2019-02-08 14:06:00 +00:00
# if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
/* We don't need the peer's public key anymore. Free it,
* so that more RAM is available for upcoming expensive
* operations like ECDHE . */
mbedtls_pk_free ( peer_pk ) ;
# endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2013-12-11 16:45:46 +00:00
return ( ret ) ;
}
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
2013-12-11 16:45:46 +00:00
2015-04-08 10:49:31 +00:00
static int ssl_parse_server_key_exchange ( mbedtls_ssl_context * ssl )
2009-01-03 21:22:43 +00:00
{
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2017-05-11 13:06:43 +00:00
const mbedtls_ssl_ciphersuite_t * ciphersuite_info =
2017-12-27 21:34:08 +00:00
ssl - > handshake - > ciphersuite_info ;
2017-06-27 15:15:06 +00:00
unsigned char * p = NULL , * end = NULL ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " => parse server key exchange " ) ) ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_RSA )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= skip parse server key exchange " ) ) ;
2009-01-03 21:22:43 +00:00
ssl - > state + + ;
return ( 0 ) ;
}
2013-10-15 09:54:47 +00:00
( ( void ) p ) ;
( ( void ) end ) ;
# endif
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
defined ( MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED )
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDH_RSA | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
2013-12-11 16:45:46 +00:00
{
2014-02-04 15:18:07 +00:00
if ( ( ret = ssl_get_ecdh_params_from_cert ( ssl ) ) ! = 0 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " ssl_get_ecdh_params_from_cert " , ret ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2014-02-04 15:18:07 +00:00
return ( ret ) ;
}
2013-12-11 16:45:46 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= skip parse server key exchange " ) ) ;
2013-12-11 16:45:46 +00:00
ssl - > state + + ;
return ( 0 ) ;
}
( ( void ) p ) ;
( ( void ) end ) ;
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
2013-12-11 16:45:46 +00:00
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2017-08-15 09:49:08 +00:00
if ( ssl - > handshake - > ecrs_enabled & &
2017-08-24 10:08:33 +00:00
ssl - > handshake - > ecrs_state = = ssl_ecrs_ske_start_processing )
2017-08-15 09:49:08 +00:00
{
2017-08-24 10:08:33 +00:00
goto start_processing ;
2017-08-15 09:49:08 +00:00
}
2017-05-18 09:27:06 +00:00
# endif
2018-08-15 12:56:18 +00:00
if ( ( ret = mbedtls_ssl_read_record ( ssl , 1 ) ) ! = 0 )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_read_record " , ret ) ;
2009-01-03 21:22:43 +00:00
return ( ret ) ;
}
2015-04-08 10:49:31 +00:00
if ( ssl - > in_msgtype ! = MBEDTLS_SSL_MSG_HANDSHAKE )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server key exchange message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ) ;
2009-01-03 21:22:43 +00:00
}
2013-10-15 08:43:36 +00:00
/*
* ServerKeyExchange may be skipped with PSK and RSA - PSK when the server
* doesn ' t use a psk_identity_hint
*/
2015-04-08 10:49:31 +00:00
if ( ssl - > in_msg [ 0 ] ! = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_PSK | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_RSA_PSK )
2013-04-19 07:13:37 +00:00
{
2017-05-24 08:16:26 +00:00
/* Current message is probably either
* CertificateRequest or ServerHelloDone */
ssl - > keep_current_message = 1 ;
2013-04-19 07:13:37 +00:00
goto exit ;
}
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " server key exchange message must not be skipped " ) ) ;
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ;
2017-05-24 08:16:26 +00:00
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ) ;
2009-01-03 21:22:43 +00:00
}
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2017-08-24 10:08:33 +00:00
if ( ssl - > handshake - > ecrs_enabled )
ssl - > handshake - > ecrs_state = ssl_ecrs_ske_start_processing ;
start_processing :
# endif
2015-04-08 10:49:31 +00:00
p = ssl - > in_msg + mbedtls_ssl_hs_hdr_len ( ssl ) ;
2013-03-21 10:56:50 +00:00
end = ssl - > in_msg + ssl - > in_hslen ;
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_BUF ( 3 , " server key exchange " , p , end - p ) ;
2013-03-21 10:56:50 +00:00
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
2015-04-08 10:49:31 +00:00
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_PSK | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_RSA_PSK | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_DHE_PSK | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
2013-04-16 16:05:29 +00:00
{
if ( ssl_parse_server_psk_hint ( ssl , & p , end ) ! = 0 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server key exchange message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-04-16 16:05:29 +00:00
}
2013-10-15 08:43:36 +00:00
} /* FALLTROUGH */
2020-03-10 11:19:08 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
2013-10-15 08:43:36 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \
defined ( MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED )
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_PSK | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_RSA_PSK )
2013-10-15 08:43:36 +00:00
; /* nothing more to do */
2013-04-19 12:30:58 +00:00
else
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||
MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
# if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
defined ( MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED )
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_DHE_RSA | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_DHE_PSK )
2013-04-19 12:30:58 +00:00
{
if ( ssl_parse_server_dh_params ( ssl , & p , end ) ! = 0 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server key exchange message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-04-19 12:30:58 +00:00
}
}
else
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
2019-01-08 12:54:37 +00:00
# if defined(MBEDTLS_USE_PSA_CRYPTO) && \
( defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ) | | \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) )
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_RSA | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
{
if ( ssl_parse_server_ecdh_params_psa ( ssl , & p , end ) ! = 0 )
{
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server key exchange message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2019-01-08 12:54:37 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
}
}
else
# endif / * MBEDTLS_USE_PSA_CRYPTO &&
( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED | |
MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ) | | \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED )
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_RSA | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_PSK | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
2013-10-11 14:53:50 +00:00
{
if ( ssl_parse_server_ecdh_params ( ssl , & p , end ) ! = 0 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server key exchange message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-10-11 14:53:50 +00:00
}
}
else
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED | |
MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
2015-09-16 20:41:06 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECJPAKE )
{
ret = mbedtls_ecjpake_read_round_two ( & ssl - > handshake - > ecjpake_ctx ,
p , end - p ) ;
if ( ret ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ecjpake_read_round_two " , ret ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2015-09-16 20:41:06 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
}
}
else
# endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2013-04-19 12:30:58 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2013-04-19 12:30:58 +00:00
}
2012-04-11 12:09:53 +00:00
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
2017-04-28 16:08:27 +00:00
if ( mbedtls_ssl_ciphersuite_uses_server_signature ( ciphersuite_info ) )
2012-04-11 12:09:53 +00:00
{
2014-09-10 15:25:02 +00:00
size_t sig_len , hashlen ;
unsigned char hash [ 64 ] ;
2015-04-08 10:49:31 +00:00
mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE ;
mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE ;
unsigned char * params = ssl - > in_msg + mbedtls_ssl_hs_hdr_len ( ssl ) ;
2014-09-10 15:25:02 +00:00
size_t params_len = p - params ;
2017-05-18 09:27:06 +00:00
void * rs_ctx = NULL ;
2013-08-19 10:06:38 +00:00
2019-02-06 18:26:03 +00:00
mbedtls_pk_context * peer_pk ;
2013-04-16 11:07:56 +00:00
/*
* Handle the digitally - signed structure
*/
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
if ( ssl - > minor_ver = = MBEDTLS_SSL_MINOR_VERSION_3 )
2013-03-20 13:39:14 +00:00
{
2013-08-28 14:21:34 +00:00
if ( ssl_parse_signature_algorithm ( ssl , & p , end ,
& md_alg , & pk_alg ) ! = 0 )
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " bad server key exchange message " ) ) ;
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-08-28 14:21:34 +00:00
}
2013-03-20 13:39:14 +00:00
2017-05-08 10:06:19 +00:00
if ( pk_alg ! =
mbedtls_ssl_get_ciphersuite_sig_pk_alg ( ciphersuite_info ) )
2013-04-16 11:07:56 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " bad server key exchange message " ) ) ;
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-04-16 11:07:56 +00:00
}
}
2013-08-19 11:50:33 +00:00
else
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
# if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
defined ( MBEDTLS_SSL_PROTO_TLS1_1 )
if ( ssl - > minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
2013-03-20 13:39:14 +00:00
{
2015-04-08 10:49:31 +00:00
pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg ( ciphersuite_info ) ;
2013-03-20 13:39:14 +00:00
2013-08-28 14:21:34 +00:00
/* Default hash for ECDSA is SHA-1 */
2015-04-08 10:49:31 +00:00
if ( pk_alg = = MBEDTLS_PK_ECDSA & & md_alg = = MBEDTLS_MD_NONE )
md_alg = MBEDTLS_MD_SHA1 ;
2013-08-28 14:21:34 +00:00
}
else
# endif
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2013-08-28 14:21:34 +00:00
}
2013-07-11 08:46:21 +00:00
2013-08-27 11:31:28 +00:00
/*
* Read signature
*/
2018-03-13 10:28:49 +00:00
if ( p > end - 2 )
{
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server key exchange message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2018-03-13 10:28:49 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
}
2013-08-19 10:06:38 +00:00
sig_len = ( p [ 0 ] < < 8 ) | p [ 1 ] ;
p + = 2 ;
2013-07-11 08:46:21 +00:00
2018-03-13 10:29:24 +00:00
if ( p ! = end - sig_len )
2013-03-20 13:39:14 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server key exchange message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ) ;
2013-03-20 13:39:14 +00:00
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_BUF ( 3 , " signature " , p , sig_len ) ;
2013-08-27 11:31:28 +00:00
2013-08-19 10:06:38 +00:00
/*
* Compute the hash that has been signed
*/
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
defined ( MBEDTLS_SSL_PROTO_TLS1_1 )
if ( md_alg = = MBEDTLS_MD_NONE )
2013-04-16 11:07:56 +00:00
{
2013-08-27 11:31:28 +00:00
hashlen = 36 ;
2017-07-20 15:17:51 +00:00
ret = mbedtls_ssl_get_key_exchange_md_ssl_tls ( ssl , hash , params ,
params_len ) ;
if ( ret ! = 0 )
2017-06-28 11:11:42 +00:00
return ( ret ) ;
2013-04-16 11:07:56 +00:00
}
else
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
MBEDTLS_SSL_PROTO_TLS1_1 */
# if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
defined ( MBEDTLS_SSL_PROTO_TLS1_2 )
if ( md_alg ! = MBEDTLS_MD_NONE )
2013-04-16 11:07:56 +00:00
{
2018-04-24 09:53:22 +00:00
ret = mbedtls_ssl_get_key_exchange_md_tls1_2 ( ssl , hash , & hashlen ,
params , params_len ,
md_alg ) ;
2017-07-20 15:17:51 +00:00
if ( ret ! = 0 )
2013-04-16 11:07:56 +00:00
return ( ret ) ;
}
2013-08-27 19:19:20 +00:00
else
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
MBEDTLS_SSL_PROTO_TLS1_2 */
2013-08-28 09:57:20 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2013-08-28 09:57:20 +00:00
}
2012-04-11 16:11:49 +00:00
2018-04-24 09:53:22 +00:00
MBEDTLS_SSL_DEBUG_BUF ( 3 , " parameters hash " , hash , hashlen ) ;
2009-01-03 21:22:43 +00:00
2019-02-06 18:26:03 +00:00
# if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
peer_pk = & ssl - > handshake - > peer_pubkey ;
# else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2015-09-03 08:44:32 +00:00
if ( ssl - > session_negotiate - > peer_cert = = NULL )
{
2019-02-06 17:37:32 +00:00
/* Should never happen */
2019-02-26 12:36:01 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
2019-02-06 17:37:32 +00:00
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2015-09-03 08:44:32 +00:00
}
2019-02-06 18:26:03 +00:00
peer_pk = & ssl - > session_negotiate - > peer_cert - > pk ;
# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2015-09-03 08:44:32 +00:00
2013-08-19 10:06:38 +00:00
/*
* Verify signature
*/
2019-02-06 18:26:03 +00:00
if ( ! mbedtls_pk_can_do ( peer_pk , pk_alg ) )
2012-04-11 16:11:49 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server key exchange message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ) ;
2013-08-19 10:06:38 +00:00
}
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2017-08-15 09:49:08 +00:00
if ( ssl - > handshake - > ecrs_enabled )
2017-08-17 12:33:31 +00:00
rs_ctx = & ssl - > handshake - > ecrs_ctx . pk ;
2017-05-18 09:27:06 +00:00
# endif
2019-02-06 18:26:03 +00:00
if ( ( ret = mbedtls_pk_verify_restartable ( peer_pk ,
2017-05-18 09:27:06 +00:00
md_alg , hash , hashlen , p , sig_len , rs_ctx ) ) ! = 0 )
2013-08-19 10:06:38 +00:00
{
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2017-05-18 09:27:06 +00:00
if ( ret ! = MBEDTLS_ERR_ECP_IN_PROGRESS )
# endif
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR ) ;
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_pk_verify " , ret ) ;
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2018-06-13 10:02:12 +00:00
if ( ret = = MBEDTLS_ERR_ECP_IN_PROGRESS )
ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS ;
# endif
2013-04-07 20:00:46 +00:00
return ( ret ) ;
2012-04-11 16:11:49 +00:00
}
2019-02-08 14:06:00 +00:00
# if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
/* We don't need the peer's public key anymore. Free it,
* so that more RAM is available for upcoming expensive
* operations like ECDHE . */
mbedtls_pk_free ( peer_pk ) ;
# endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2009-01-03 21:22:43 +00:00
}
2020-03-10 11:19:08 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
2009-01-03 21:22:43 +00:00
2013-04-16 16:05:29 +00:00
exit :
2009-01-03 21:22:43 +00:00
ssl - > state + + ;
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= parse server key exchange " ) ) ;
2009-01-03 21:22:43 +00:00
return ( 0 ) ;
}
2020-03-10 11:19:08 +00:00
# if ! defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2015-04-08 10:49:31 +00:00
static int ssl_parse_certificate_request ( mbedtls_ssl_context * ssl )
2013-11-25 16:38:36 +00:00
{
2017-05-11 13:06:43 +00:00
const mbedtls_ssl_ciphersuite_t * ciphersuite_info =
2017-12-27 21:34:08 +00:00
ssl - > handshake - > ciphersuite_info ;
2013-11-25 16:38:36 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " => parse certificate request " ) ) ;
2013-11-25 16:38:36 +00:00
2017-04-28 16:08:27 +00:00
if ( ! mbedtls_ssl_ciphersuite_cert_req_allowed ( ciphersuite_info ) )
2013-11-25 16:38:36 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= skip parse certificate request " ) ) ;
2013-11-25 16:38:36 +00:00
ssl - > state + + ;
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2013-11-25 16:38:36 +00:00
}
2020-03-10 11:19:08 +00:00
# else /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
2015-04-08 10:49:31 +00:00
static int ssl_parse_certificate_request ( mbedtls_ssl_context * ssl )
2009-01-03 21:22:43 +00:00
{
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2016-02-24 14:13:22 +00:00
unsigned char * buf ;
size_t n = 0 ;
2013-08-27 19:19:20 +00:00
size_t cert_type_len = 0 , dn_len = 0 ;
2017-05-11 13:06:43 +00:00
const mbedtls_ssl_ciphersuite_t * ciphersuite_info =
2017-12-27 21:34:08 +00:00
ssl - > handshake - > ciphersuite_info ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " => parse certificate request " ) ) ;
2009-01-03 21:22:43 +00:00
2017-04-28 16:08:27 +00:00
if ( ! mbedtls_ssl_ciphersuite_cert_req_allowed ( ciphersuite_info ) )
2013-11-25 16:38:36 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= skip parse certificate request " ) ) ;
2013-11-25 16:38:36 +00:00
ssl - > state + + ;
return ( 0 ) ;
}
2018-08-15 12:56:18 +00:00
if ( ( ret = mbedtls_ssl_read_record ( ssl , 1 ) ) ! = 0 )
2009-01-03 21:22:43 +00:00
{
2017-05-24 08:16:26 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_read_record " , ret ) ;
return ( ret ) ;
}
2013-04-16 16:05:29 +00:00
2017-05-24 08:16:26 +00:00
if ( ssl - > in_msgtype ! = MBEDTLS_SSL_MSG_HANDSHAKE )
{
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad certificate request message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ;
2017-05-24 08:16:26 +00:00
return ( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ) ;
2009-01-03 21:22:43 +00:00
}
ssl - > state + + ;
2017-05-24 08:16:26 +00:00
ssl - > client_auth = ( ssl - > in_msg [ 0 ] = = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST ) ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " got %s certificate request " ,
2009-01-03 21:22:43 +00:00
ssl - > client_auth ? " a " : " no " ) ) ;
2012-11-23 12:38:07 +00:00
if ( ssl - > client_auth = = 0 )
2017-05-24 08:16:26 +00:00
{
/* Current message is probably the ServerHelloDone */
ssl - > keep_current_message = 1 ;
2012-11-23 12:38:07 +00:00
goto exit ;
2017-05-24 08:16:26 +00:00
}
2013-04-16 16:05:29 +00:00
2014-09-10 17:25:43 +00:00
/*
* struct {
* ClientCertificateType certificate_types < 1. .2 ^ 8 - 1 > ;
* SignatureAndHashAlgorithm
* supported_signature_algorithms < 2 ^ 16 - 1 > ; - - TLS 1.2 only
* DistinguishedName certificate_authorities < 0. .2 ^ 16 - 1 > ;
* } CertificateRequest ;
2016-02-24 14:13:22 +00:00
*
* Since we only support a single certificate on clients , let ' s just
* ignore all the information that ' s supposed to help us pick a
* certificate .
*
* We could check that our certificate matches the request , and bail out
* if it doesn ' t , but it ' s simpler to just send the certificate anyway ,
* and give the server the opportunity to decide if it should terminate
* the connection when it doesn ' t like our certificate .
*
* Same goes for the hash in TLS 1.2 ' s signature_algorithms : at this
* point we only have one hash available ( see comments in
2016-03-01 13:16:57 +00:00
* write_certificate_verify ) , so let ' s just use what we have .
2016-02-24 14:13:22 +00:00
*
* However , we still minimally parse the message to check it is at least
* superficially sane .
2014-09-10 17:25:43 +00:00
*/
2012-11-23 12:38:07 +00:00
buf = ssl - > in_msg ;
2013-04-16 11:15:56 +00:00
2016-02-24 14:13:22 +00:00
/* certificate_types */
2018-04-05 08:20:09 +00:00
if ( ssl - > in_hslen < = mbedtls_ssl_hs_hdr_len ( ssl ) )
{
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad certificate request message " ) ) ;
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
return ( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ) ;
}
2015-04-08 10:49:31 +00:00
cert_type_len = buf [ mbedtls_ssl_hs_hdr_len ( ssl ) ] ;
2012-11-23 12:38:07 +00:00
n = cert_type_len ;
2018-03-20 10:19:50 +00:00
/*
2018-04-05 12:48:55 +00:00
* In the subsequent code there are two paths that read from buf :
2018-03-20 10:19:50 +00:00
* * the length of the signature algorithms field ( if minor version of
* SSL is 3 ) ,
* * distinguished name length otherwise .
* Both reach at most the index :
* . . . hdr_len + 2 + n ,
* therefore the buffer length at this point must be greater than that
* regardless of the actual code path .
*/
if ( ssl - > in_hslen < = mbedtls_ssl_hs_hdr_len ( ssl ) + 2 + n )
2012-11-23 12:38:07 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad certificate request message " ) ) ;
2017-05-03 14:28:34 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ) ;
2012-11-23 12:38:07 +00:00
}
2016-02-24 14:13:22 +00:00
/* supported_signature_algorithms */
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
if ( ssl - > minor_ver = = MBEDTLS_SSL_MINOR_VERSION_3 )
2012-11-23 12:38:07 +00:00
{
2017-05-08 10:06:19 +00:00
size_t sig_alg_len =
( ( buf [ mbedtls_ssl_hs_hdr_len ( ssl ) + 1 + n ] < < 8 )
| ( buf [ mbedtls_ssl_hs_hdr_len ( ssl ) + 2 + n ] ) ) ;
2016-10-13 16:21:01 +00:00
# if defined(MBEDTLS_DEBUG_C)
2018-03-20 13:09:53 +00:00
unsigned char * sig_alg ;
2016-10-13 16:21:01 +00:00
size_t i ;
2018-03-20 13:09:53 +00:00
# endif
2016-10-13 16:21:01 +00:00
2018-03-20 13:09:53 +00:00
/*
2018-04-05 12:48:55 +00:00
* The furthest access in buf is in the loop few lines below :
2018-03-20 13:09:53 +00:00
* sig_alg [ i + 1 ] ,
* where :
* sig_alg = buf + . . . hdr_len + 3 + n ,
* max ( i ) = sig_alg_len - 1.
2018-04-05 12:48:55 +00:00
* Therefore the furthest access is :
2018-03-20 13:09:53 +00:00
* buf [ . . . hdr_len + 3 + n + sig_alg_len - 1 + 1 ] ,
* which reduces to :
* buf [ . . . hdr_len + 3 + n + sig_alg_len ] ,
* which is one less than we need the buf to be .
*/
2017-05-08 10:06:19 +00:00
if ( ssl - > in_hslen < = mbedtls_ssl_hs_hdr_len ( ssl )
+ 3 + n + sig_alg_len )
2018-03-20 13:09:53 +00:00
{
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad certificate request message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2018-03-20 13:09:53 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ) ;
}
2016-10-13 16:21:01 +00:00
2018-03-20 13:09:53 +00:00
# if defined(MBEDTLS_DEBUG_C)
sig_alg = buf + mbedtls_ssl_hs_hdr_len ( ssl ) + 3 + n ;
2016-10-13 16:21:01 +00:00
for ( i = 0 ; i < sig_alg_len ; i + = 2 )
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 ,
( " Supported Signature Algorithm found: %d,%d " ,
sig_alg [ i ] , sig_alg [ i + 1 ] ) ) ;
2016-10-13 16:21:01 +00:00
}
# endif
2012-11-23 12:38:07 +00:00
2016-02-24 14:13:22 +00:00
n + = 2 + sig_alg_len ;
2013-04-16 11:15:56 +00:00
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2012-11-23 12:38:07 +00:00
2016-02-24 14:13:22 +00:00
/* certificate_authorities */
dn_len = ( ( buf [ mbedtls_ssl_hs_hdr_len ( ssl ) + 1 + n ] < < 8 )
| ( buf [ mbedtls_ssl_hs_hdr_len ( ssl ) + 2 + n ] ) ) ;
2012-11-23 12:38:07 +00:00
n + = dn_len ;
2016-02-24 14:13:22 +00:00
if ( ssl - > in_hslen ! = mbedtls_ssl_hs_hdr_len ( ssl ) + 3 + n )
2012-11-23 12:38:07 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad certificate request message " ) ) ;
2017-05-03 14:28:34 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ) ;
2012-11-23 12:38:07 +00:00
}
exit :
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= parse certificate request " ) ) ;
2009-01-03 21:22:43 +00:00
return ( 0 ) ;
}
2020-03-10 11:19:08 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
static int ssl_parse_server_hello_done ( mbedtls_ssl_context * ssl )
2009-01-03 21:22:43 +00:00
{
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " => parse server hello done " ) ) ;
2009-01-03 21:22:43 +00:00
2018-08-15 12:56:18 +00:00
if ( ( ret = mbedtls_ssl_read_record ( ssl , 1 ) ) ! = 0 )
2009-01-03 21:22:43 +00:00
{
2017-05-24 08:16:26 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_read_record " , ret ) ;
return ( ret ) ;
}
2009-01-03 21:22:43 +00:00
2017-05-24 08:16:26 +00:00
if ( ssl - > in_msgtype ! = MBEDTLS_SSL_MSG_HANDSHAKE )
{
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello done message " ) ) ;
return ( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ) ;
2009-01-03 21:22:43 +00:00
}
2015-04-08 10:49:31 +00:00
if ( ssl - > in_hslen ! = mbedtls_ssl_hs_hdr_len ( ssl ) | |
ssl - > in_msg [ 0 ] ! = MBEDTLS_SSL_HS_SERVER_HELLO_DONE )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad server hello done message " ) ) ;
2017-05-03 14:28:34 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE ) ;
2009-01-03 21:22:43 +00:00
}
ssl - > state + + ;
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_DTLS)
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > transport = = MBEDTLS_SSL_TRANSPORT_DATAGRAM )
2015-04-08 10:49:31 +00:00
mbedtls_ssl_recv_flight_completed ( ssl ) ;
2014-09-19 13:09:21 +00:00
# endif
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= parse server hello done " ) ) ;
2009-01-03 21:22:43 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
static int ssl_write_client_key_exchange ( mbedtls_ssl_context * ssl )
2009-01-03 21:22:43 +00:00
{
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2019-01-14 09:41:16 +00:00
size_t header_len ;
size_t content_len ;
2017-05-11 13:06:43 +00:00
const mbedtls_ssl_ciphersuite_t * ciphersuite_info =
2017-12-27 21:34:08 +00:00
ssl - > handshake - > ciphersuite_info ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " => write client key exchange " ) ) ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_DHE_RSA )
2009-01-03 21:22:43 +00:00
{
/*
* DHM key exchange - - send G ^ X mod P
*/
2019-01-14 09:41:16 +00:00
content_len = ssl - > handshake - > dhm_ctx . len ;
2009-01-03 21:22:43 +00:00
2019-01-14 09:41:16 +00:00
ssl - > out_msg [ 4 ] = ( unsigned char ) ( content_len > > 8 ) ;
ssl - > out_msg [ 5 ] = ( unsigned char ) ( content_len ) ;
header_len = 6 ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
ret = mbedtls_dhm_make_public ( & ssl - > handshake - > dhm_ctx ,
2017-05-08 10:06:19 +00:00
( int ) mbedtls_mpi_size ( & ssl - > handshake - > dhm_ctx . P ) ,
& ssl - > out_msg [ header_len ] , content_len ,
ssl - > conf - > f_rng , ssl - > conf - > p_rng ) ;
2009-01-03 21:22:43 +00:00
if ( ret ! = 0 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_dhm_make_public " , ret ) ;
2009-01-03 21:22:43 +00:00
return ( ret ) ;
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MPI ( 3 , " DHM: X " , & ssl - > handshake - > dhm_ctx . X ) ;
MBEDTLS_SSL_DEBUG_MPI ( 3 , " DHM: GX " , & ssl - > handshake - > dhm_ctx . GX ) ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
if ( ( ret = mbedtls_dhm_calc_secret ( & ssl - > handshake - > dhm_ctx ,
2017-05-08 10:06:19 +00:00
ssl - > handshake - > premaster ,
MBEDTLS_PREMASTER_SIZE ,
& ssl - > handshake - > pmslen ,
ssl - > conf - > f_rng , ssl - > conf - > p_rng ) ) ! = 0 )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_dhm_calc_secret " , ret ) ;
2009-01-03 21:22:43 +00:00
return ( ret ) ;
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MPI ( 3 , " DHM: K " , & ssl - > handshake - > dhm_ctx . K ) ;
2009-01-03 21:22:43 +00:00
}
else
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
2019-01-08 11:39:35 +00:00
# if defined(MBEDTLS_USE_PSA_CRYPTO) && \
( defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ) | | \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) )
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_RSA | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
{
psa_status_t status ;
2019-08-08 09:28:27 +00:00
psa_key_attributes_t key_attributes ;
2019-01-08 11:39:35 +00:00
mbedtls_ssl_handshake_params * handshake = ssl - > handshake ;
unsigned char own_pubkey [ MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH ] ;
size_t own_pubkey_len ;
unsigned char * own_pubkey_ecpoint ;
size_t own_pubkey_ecpoint_len ;
2019-01-14 09:41:16 +00:00
header_len = 4 ;
2019-01-08 11:39:35 +00:00
2019-01-11 14:35:30 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " Perform PSA-based ECDH computation. " ) ) ;
2019-01-08 11:39:35 +00:00
/*
* Generate EC private key for ECDHE exchange .
*/
/* The master secret is obtained from the shared ECDH secret by
* applying the TLS 1.2 PRF with a specific salt and label . While
* the PSA Crypto API encourages combining key agreement schemes
* such as ECDH with fixed KDFs such as TLS 1.2 PRF , it does not
* yet support the provisioning of salt + label to the KDF .
* For the time being , we therefore need to split the computation
* of the ECDH secret and the application of the TLS 1.2 PRF . */
2019-08-08 09:28:27 +00:00
key_attributes = psa_key_attributes_init ( ) ;
psa_set_key_usage_flags ( & key_attributes , PSA_KEY_USAGE_DERIVE ) ;
2019-08-08 10:12:24 +00:00
psa_set_key_algorithm ( & key_attributes , PSA_ALG_ECDH ) ;
2019-12-19 12:31:53 +00:00
psa_set_key_type ( & key_attributes , handshake - > ecdh_psa_type ) ;
psa_set_key_bits ( & key_attributes , handshake - > ecdh_bits ) ;
2019-01-08 11:39:35 +00:00
/* Generate ECDH private key. */
2019-08-08 09:28:27 +00:00
status = psa_generate_key ( & key_attributes ,
2019-08-08 10:12:24 +00:00
& handshake - > ecdh_psa_privkey ) ;
2019-01-08 11:39:35 +00:00
if ( status ! = PSA_SUCCESS )
return ( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ) ;
/* Export the public part of the ECDH private key from PSA
* and convert it to ECPoint format used in ClientKeyExchange . */
status = psa_export_public_key ( handshake - > ecdh_psa_privkey ,
own_pubkey , sizeof ( own_pubkey ) ,
& own_pubkey_len ) ;
if ( status ! = PSA_SUCCESS )
return ( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ) ;
if ( mbedtls_psa_tls_psa_ec_to_ecpoint ( own_pubkey ,
own_pubkey_len ,
& own_pubkey_ecpoint ,
& own_pubkey_ecpoint_len ) ! = 0 )
{
return ( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ) ;
}
/* Copy ECPoint structure to outgoing message buffer. */
2019-05-07 12:19:33 +00:00
ssl - > out_msg [ header_len ] = ( unsigned char ) own_pubkey_ecpoint_len ;
2019-01-14 09:41:16 +00:00
memcpy ( ssl - > out_msg + header_len + 1 ,
own_pubkey_ecpoint , own_pubkey_ecpoint_len ) ;
content_len = own_pubkey_ecpoint_len + 1 ;
2019-01-08 11:39:35 +00:00
/* The ECDH secret is the premaster secret used for key derivation. */
2019-08-08 10:12:24 +00:00
/* Compute ECDH shared secret. */
status = psa_raw_key_agreement ( PSA_ALG_ECDH ,
handshake - > ecdh_psa_privkey ,
handshake - > ecdh_psa_peerkey ,
handshake - > ecdh_psa_peerkey_len ,
ssl - > handshake - > premaster ,
sizeof ( ssl - > handshake - > premaster ) ,
& ssl - > handshake - > pmslen ) ;
2019-01-08 11:39:35 +00:00
if ( status ! = PSA_SUCCESS )
return ( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ) ;
status = psa_destroy_key ( handshake - > ecdh_psa_privkey ) ;
if ( status ! = PSA_SUCCESS )
return ( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ) ;
handshake - > ecdh_psa_privkey = 0 ;
}
else
# endif / * MBEDTLS_USE_PSA_CRYPTO &&
( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED | |
MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
defined ( MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) | | \
defined ( MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ) | | \
defined ( MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED )
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_RSA | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDH_RSA | |
ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
2013-03-20 13:39:14 +00:00
{
/*
* ECDH key exchange - - send client public value
*/
2019-01-14 09:41:16 +00:00
header_len = 4 ;
2013-03-20 13:39:14 +00:00
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2017-08-15 09:49:08 +00:00
if ( ssl - > handshake - > ecrs_enabled )
{
2018-10-16 08:28:17 +00:00
if ( ssl - > handshake - > ecrs_state = = ssl_ecrs_cke_ecdh_calc_secret )
2017-08-15 09:49:08 +00:00
goto ecdh_calc_secret ;
2017-05-18 10:35:37 +00:00
2017-08-15 09:49:08 +00:00
mbedtls_ecdh_enable_restart ( & ssl - > handshake - > ecdh_ctx ) ;
}
2017-05-16 07:26:48 +00:00
# endif
2015-04-08 10:49:31 +00:00
ret = mbedtls_ecdh_make_public ( & ssl - > handshake - > ecdh_ctx ,
2019-01-14 09:41:16 +00:00
& content_len ,
& ssl - > out_msg [ header_len ] , 1000 ,
2015-05-07 11:35:38 +00:00
ssl - > conf - > f_rng , ssl - > conf - > p_rng ) ;
2013-03-20 13:39:14 +00:00
if ( ret ! = 0 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ecdh_make_public " , ret ) ;
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2018-06-13 10:02:12 +00:00
if ( ret = = MBEDTLS_ERR_ECP_IN_PROGRESS )
ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS ;
# endif
2013-03-20 13:39:14 +00:00
return ( ret ) ;
}
2019-01-31 13:20:20 +00:00
MBEDTLS_SSL_DEBUG_ECDH ( 3 , & ssl - > handshake - > ecdh_ctx ,
MBEDTLS_DEBUG_ECDH_Q ) ;
2013-03-20 13:39:14 +00:00
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2017-08-15 09:49:08 +00:00
if ( ssl - > handshake - > ecrs_enabled )
{
2019-01-14 09:41:16 +00:00
ssl - > handshake - > ecrs_n = content_len ;
2018-10-16 08:28:17 +00:00
ssl - > handshake - > ecrs_state = ssl_ecrs_cke_ecdh_calc_secret ;
2017-08-15 09:49:08 +00:00
}
2017-05-16 07:26:48 +00:00
ecdh_calc_secret :
2017-08-15 09:49:08 +00:00
if ( ssl - > handshake - > ecrs_enabled )
2019-01-14 09:41:16 +00:00
content_len = ssl - > handshake - > ecrs_n ;
2017-05-16 07:26:48 +00:00
# endif
2015-04-08 10:49:31 +00:00
if ( ( ret = mbedtls_ecdh_calc_secret ( & ssl - > handshake - > ecdh_ctx ,
2017-05-08 10:06:19 +00:00
& ssl - > handshake - > pmslen ,
ssl - > handshake - > premaster ,
MBEDTLS_MPI_MAX_SIZE ,
ssl - > conf - > f_rng , ssl - > conf - > p_rng ) ) ! = 0 )
2013-03-20 13:39:14 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ecdh_calc_secret " , ret ) ;
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2018-06-13 10:02:12 +00:00
if ( ret = = MBEDTLS_ERR_ECP_IN_PROGRESS )
ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS ;
# endif
2013-03-20 13:39:14 +00:00
return ( ret ) ;
}
2019-01-31 13:20:20 +00:00
MBEDTLS_SSL_DEBUG_ECDH ( 3 , & ssl - > handshake - > ecdh_ctx ,
MBEDTLS_DEBUG_ECDH_Z ) ;
2013-03-20 13:39:14 +00:00
}
else
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED | |
MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED | |
MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
2017-04-28 16:08:27 +00:00
if ( mbedtls_ssl_ciphersuite_uses_psk ( ciphersuite_info ) )
2013-04-16 16:05:29 +00:00
{
/*
* opaque psk_identity < 0. .2 ^ 16 - 1 > ;
*/
2018-10-26 10:38:07 +00:00
if ( ssl_conf_has_static_psk ( ssl - > conf ) = = 0 )
2015-07-07 09:41:21 +00:00
{
2018-10-23 10:54:44 +00:00
/* We don't offer PSK suites if we don't have a PSK,
* and we check that the server ' s choice is among the
* ciphersuites we offered , so this should never happen . */
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2015-07-07 09:41:21 +00:00
}
2013-04-16 16:05:29 +00:00
2019-01-14 09:41:16 +00:00
header_len = 4 ;
content_len = ssl - > conf - > psk_identity_len ;
2015-08-27 14:37:35 +00:00
2019-01-14 09:41:16 +00:00
if ( header_len + 2 + content_len > MBEDTLS_SSL_OUT_CONTENT_LEN )
2015-08-27 14:37:35 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " psk identity too long or SSL buffer too short " ) ) ;
2015-08-27 14:37:35 +00:00
return ( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ) ;
}
2019-01-14 09:41:16 +00:00
ssl - > out_msg [ header_len + + ] = ( unsigned char ) ( content_len > > 8 ) ;
ssl - > out_msg [ header_len + + ] = ( unsigned char ) ( content_len ) ;
2013-04-16 16:05:29 +00:00
2019-01-14 09:41:16 +00:00
memcpy ( ssl - > out_msg + header_len ,
ssl - > conf - > psk_identity ,
ssl - > conf - > psk_identity_len ) ;
header_len + = ssl - > conf - > psk_identity_len ;
2013-04-16 16:05:29 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_PSK )
2013-10-14 11:09:25 +00:00
{
2019-01-14 09:41:16 +00:00
content_len = 0 ;
2013-10-14 11:09:25 +00:00
}
2013-10-14 12:01:58 +00:00
else
# endif
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_RSA_PSK )
2013-10-14 15:39:48 +00:00
{
2018-10-23 10:59:34 +00:00
# if defined(MBEDTLS_USE_PSA_CRYPTO)
/* Opaque PSKs are currently only supported for PSK-only suites. */
2018-10-26 10:38:07 +00:00
if ( ssl_conf_has_static_raw_psk ( ssl - > conf ) = = 0 )
2018-10-23 10:59:34 +00:00
return ( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ) ;
# endif /* MBEDTLS_USE_PSA_CRYPTO */
2019-01-14 09:41:16 +00:00
if ( ( ret = ssl_write_encrypted_pms ( ssl , header_len ,
& content_len , 2 ) ) ! = 0 )
2013-10-14 15:39:48 +00:00
return ( ret ) ;
}
else
# endif
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_DHE_PSK )
2013-04-19 12:30:58 +00:00
{
2018-10-23 10:59:34 +00:00
# if defined(MBEDTLS_USE_PSA_CRYPTO)
/* Opaque PSKs are currently only supported for PSK-only suites. */
2018-10-26 10:38:07 +00:00
if ( ssl_conf_has_static_raw_psk ( ssl - > conf ) = = 0 )
2018-10-23 10:59:34 +00:00
return ( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ) ;
# endif /* MBEDTLS_USE_PSA_CRYPTO */
2013-10-14 12:01:58 +00:00
/*
* ClientDiffieHellmanPublic public ( DHM send G ^ X mod P )
*/
2019-01-14 09:41:16 +00:00
content_len = ssl - > handshake - > dhm_ctx . len ;
2015-08-27 14:37:35 +00:00
2019-01-14 09:41:16 +00:00
if ( header_len + 2 + content_len >
MBEDTLS_SSL_OUT_CONTENT_LEN )
2015-08-27 14:37:35 +00:00
{
2017-05-08 10:06:19 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " psk identity or DHM size too long or SSL buffer too short " ) ) ;
2015-08-27 14:37:35 +00:00
return ( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ) ;
}
2019-01-14 09:41:16 +00:00
ssl - > out_msg [ header_len + + ] = ( unsigned char ) ( content_len > > 8 ) ;
ssl - > out_msg [ header_len + + ] = ( unsigned char ) ( content_len ) ;
2013-10-14 12:01:58 +00:00
2015-04-08 10:49:31 +00:00
ret = mbedtls_dhm_make_public ( & ssl - > handshake - > dhm_ctx ,
( int ) mbedtls_mpi_size ( & ssl - > handshake - > dhm_ctx . P ) ,
2019-01-14 09:41:16 +00:00
& ssl - > out_msg [ header_len ] , content_len ,
2015-05-07 11:35:38 +00:00
ssl - > conf - > f_rng , ssl - > conf - > p_rng ) ;
2013-10-14 12:01:58 +00:00
if ( ret ! = 0 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_dhm_make_public " , ret ) ;
2013-10-14 12:01:58 +00:00
return ( ret ) ;
}
2013-04-19 12:30:58 +00:00
}
2013-10-14 12:01:58 +00:00
else
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
# if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
2013-10-14 12:01:58 +00:00
{
2018-10-23 10:59:34 +00:00
# if defined(MBEDTLS_USE_PSA_CRYPTO)
/* Opaque PSKs are currently only supported for PSK-only suites. */
2018-10-26 10:38:07 +00:00
if ( ssl_conf_has_static_raw_psk ( ssl - > conf ) = = 0 )
2018-10-23 10:59:34 +00:00
return ( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ) ;
# endif /* MBEDTLS_USE_PSA_CRYPTO */
2013-10-14 12:01:58 +00:00
/*
* ClientECDiffieHellmanPublic public ;
*/
2019-01-14 09:41:16 +00:00
ret = mbedtls_ecdh_make_public ( & ssl - > handshake - > ecdh_ctx ,
& content_len ,
& ssl - > out_msg [ header_len ] ,
MBEDTLS_SSL_OUT_CONTENT_LEN - header_len ,
2015-05-07 11:35:38 +00:00
ssl - > conf - > f_rng , ssl - > conf - > p_rng ) ;
2013-10-14 12:01:58 +00:00
if ( ret ! = 0 )
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ecdh_make_public " , ret ) ;
2013-10-14 12:01:58 +00:00
return ( ret ) ;
}
2013-04-19 12:30:58 +00:00
2019-01-31 13:20:20 +00:00
MBEDTLS_SSL_DEBUG_ECDH ( 3 , & ssl - > handshake - > ecdh_ctx ,
MBEDTLS_DEBUG_ECDH_Q ) ;
2013-10-14 12:01:58 +00:00
}
else
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
2013-10-11 14:53:50 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2013-10-11 14:53:50 +00:00
}
2013-04-19 12:30:58 +00:00
2018-10-23 14:26:40 +00:00
# if defined(MBEDTLS_USE_PSA_CRYPTO) && \
defined ( MBEDTLS_KEY_EXCHANGE_PSK_ENABLED )
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_PSK & &
ssl - > minor_ver = = MBEDTLS_SSL_MINOR_VERSION_3 & &
2018-10-26 10:38:07 +00:00
ssl_conf_has_static_raw_psk ( ssl - > conf ) = = 0 )
2018-10-23 14:26:40 +00:00
{
2020-06-11 07:34:06 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 ,
( " skip PMS generation for opaque PSK " ) ) ;
2018-10-23 14:26:40 +00:00
}
else
# endif / * MBEDTLS_USE_PSA_CRYPTO &&
MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
2015-04-08 10:49:31 +00:00
if ( ( ret = mbedtls_ssl_psk_derive_premaster ( ssl ,
2013-10-14 11:09:25 +00:00
ciphersuite_info - > key_exchange ) ) ! = 0 )
2013-04-19 12:30:58 +00:00
{
2020-06-11 07:34:06 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 ,
" mbedtls_ssl_psk_derive_premaster " , ret ) ;
2013-04-19 12:30:58 +00:00
return ( ret ) ;
}
}
else
2020-03-10 11:19:08 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_RSA )
2009-01-03 21:22:43 +00:00
{
2019-01-14 09:41:16 +00:00
header_len = 4 ;
if ( ( ret = ssl_write_encrypted_pms ( ssl , header_len ,
& content_len , 0 ) ) ! = 0 )
2013-08-21 09:51:08 +00:00
return ( ret ) ;
2009-01-03 21:22:43 +00:00
}
2013-04-18 20:46:23 +00:00
else
2015-09-16 20:41:06 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
if ( ciphersuite_info - > key_exchange = = MBEDTLS_KEY_EXCHANGE_ECJPAKE )
{
2019-01-14 09:41:16 +00:00
header_len = 4 ;
2015-09-16 20:41:06 +00:00
ret = mbedtls_ecjpake_write_round_two ( & ssl - > handshake - > ecjpake_ctx ,
2019-01-14 09:41:16 +00:00
ssl - > out_msg + header_len ,
MBEDTLS_SSL_OUT_CONTENT_LEN - header_len ,
& content_len ,
2015-09-16 20:41:06 +00:00
ssl - > conf - > f_rng , ssl - > conf - > p_rng ) ;
if ( ret ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ecjpake_write_round_two " , ret ) ;
return ( ret ) ;
}
ret = mbedtls_ecjpake_derive_secret ( & ssl - > handshake - > ecjpake_ctx ,
ssl - > handshake - > premaster , 32 , & ssl - > handshake - > pmslen ,
ssl - > conf - > f_rng , ssl - > conf - > p_rng ) ;
if ( ret ! = 0 )
{
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ecjpake_derive_secret " , ret ) ;
return ( ret ) ;
}
}
else
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
2013-04-18 20:46:23 +00:00
{
( ( void ) ciphersuite_info ) ;
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2013-04-18 20:46:23 +00:00
}
2009-01-03 21:22:43 +00:00
2019-01-14 09:41:16 +00:00
ssl - > out_msglen = header_len + content_len ;
2015-04-08 10:49:31 +00:00
ssl - > out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE ;
ssl - > out_msg [ 0 ] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE ;
2009-01-03 21:22:43 +00:00
ssl - > state + + ;
2017-09-13 07:38:11 +00:00
if ( ( ret = mbedtls_ssl_write_handshake_msg ( ssl ) ) ! = 0 )
2009-01-03 21:22:43 +00:00
{
2017-09-13 07:38:11 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_write_handshake_msg " , ret ) ;
2009-01-03 21:22:43 +00:00
return ( ret ) ;
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= write client key exchange " ) ) ;
2009-01-03 21:22:43 +00:00
return ( 0 ) ;
}
2020-03-10 11:19:08 +00:00
# if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2015-04-08 10:49:31 +00:00
static int ssl_write_certificate_verify ( mbedtls_ssl_context * ssl )
2013-04-19 12:30:58 +00:00
{
2017-05-11 13:06:43 +00:00
const mbedtls_ssl_ciphersuite_t * ciphersuite_info =
2017-12-27 21:34:08 +00:00
ssl - > handshake - > ciphersuite_info ;
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2013-04-19 12:30:58 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " => write certificate verify " ) ) ;
2013-04-19 12:30:58 +00:00
2015-04-08 10:49:31 +00:00
if ( ( ret = mbedtls_ssl_derive_keys ( ssl ) ) ! = 0 )
2014-10-20 18:33:10 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_derive_keys " , ret ) ;
2014-10-20 18:33:10 +00:00
return ( ret ) ;
}
2019-02-07 12:32:43 +00:00
if ( ! mbedtls_ssl_ciphersuite_cert_req_allowed ( ciphersuite_info ) )
2013-04-19 12:30:58 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= skip write certificate verify " ) ) ;
2013-04-19 12:30:58 +00:00
ssl - > state + + ;
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2013-04-19 12:30:58 +00:00
}
2020-03-10 11:19:08 +00:00
# else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
2015-04-08 10:49:31 +00:00
static int ssl_write_certificate_verify ( mbedtls_ssl_context * ssl )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ;
2017-05-11 13:06:43 +00:00
const mbedtls_ssl_ciphersuite_t * ciphersuite_info =
2017-12-27 21:34:08 +00:00
ssl - > handshake - > ciphersuite_info ;
2012-04-11 12:09:53 +00:00
size_t n = 0 , offset = 0 ;
2012-04-18 14:23:57 +00:00
unsigned char hash [ 48 ] ;
2013-08-27 11:31:28 +00:00
unsigned char * hash_start = hash ;
2015-04-08 10:49:31 +00:00
mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE ;
2019-05-03 09:43:28 +00:00
size_t hashlen ;
2017-05-17 09:56:15 +00:00
void * rs_ctx = NULL ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " => write certificate verify " ) ) ;
2009-01-03 21:22:43 +00:00
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2017-08-15 09:49:08 +00:00
if ( ssl - > handshake - > ecrs_enabled & &
2017-08-24 10:08:33 +00:00
ssl - > handshake - > ecrs_state = = ssl_ecrs_crt_vrfy_sign )
2017-08-15 09:49:08 +00:00
{
2017-08-24 10:08:33 +00:00
goto sign ;
2017-08-15 09:49:08 +00:00
}
2017-05-17 09:56:15 +00:00
# endif
2015-04-08 10:49:31 +00:00
if ( ( ret = mbedtls_ssl_derive_keys ( ssl ) ) ! = 0 )
2014-10-20 18:33:10 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_derive_keys " , ret ) ;
2014-10-20 18:33:10 +00:00
return ( ret ) ;
}
2019-02-07 12:32:43 +00:00
if ( ! mbedtls_ssl_ciphersuite_cert_req_allowed ( ciphersuite_info ) )
2013-04-18 20:46:23 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= skip write certificate verify " ) ) ;
2013-04-18 20:46:23 +00:00
ssl - > state + + ;
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
if ( ssl - > client_auth = = 0 | | mbedtls_ssl_own_cert ( ssl ) = = NULL )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= skip write certificate verify " ) ) ;
2009-01-03 21:22:43 +00:00
ssl - > state + + ;
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
if ( mbedtls_ssl_own_key ( ssl ) = = NULL )
2009-01-03 21:22:43 +00:00
{
2015-07-07 09:41:21 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " got no private key for certificate " ) ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ) ;
2009-01-03 21:22:43 +00:00
}
/*
2017-08-24 10:08:33 +00:00
* Make a signature of the handshake digests
2009-01-03 21:22:43 +00:00
*/
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2017-08-24 10:08:33 +00:00
if ( ssl - > handshake - > ecrs_enabled )
ssl - > handshake - > ecrs_state = ssl_ecrs_crt_vrfy_sign ;
sign :
# endif
2019-05-03 09:43:28 +00:00
ssl - > handshake - > calc_verify ( ssl , hash , & hashlen ) ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
defined ( MBEDTLS_SSL_PROTO_TLS1_1 )
if ( ssl - > minor_ver ! = MBEDTLS_SSL_MINOR_VERSION_3 )
2012-04-11 12:09:53 +00:00
{
2012-11-23 12:38:07 +00:00
/*
* digitally - signed struct {
* opaque md5_hash [ 16 ] ;
* opaque sha_hash [ 20 ] ;
* } ;
*
* md5_hash
* MD5 ( handshake_messages ) ;
*
* sha_hash
* SHA ( handshake_messages ) ;
*/
2015-04-08 10:49:31 +00:00
md_alg = MBEDTLS_MD_NONE ;
2013-08-27 11:31:28 +00:00
/*
* For ECDSA , default hash is SHA - 1 only
*/
2015-04-08 10:49:31 +00:00
if ( mbedtls_pk_can_do ( mbedtls_ssl_own_key ( ssl ) , MBEDTLS_PK_ECDSA ) )
2013-08-27 11:31:28 +00:00
{
hash_start + = 16 ;
hashlen - = 16 ;
2015-04-08 10:49:31 +00:00
md_alg = MBEDTLS_MD_SHA1 ;
2013-08-27 11:31:28 +00:00
}
2012-11-23 12:38:07 +00:00
}
else
2015-04-08 10:49:31 +00:00
# endif / * MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
MBEDTLS_SSL_PROTO_TLS1_1 */
# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
if ( ssl - > minor_ver = = MBEDTLS_SSL_MINOR_VERSION_3 )
2012-11-23 12:38:07 +00:00
{
/*
* digitally - signed struct {
* opaque handshake_messages [ handshake_messages_length ] ;
* } ;
*
* Taking shortcut here . We assume that the server always allows the
* PRF Hash function and has sent it in the allowed signature
* algorithms list received in the Certificate Request message .
*
* Until we encounter a server that does not , we will take this
* shortcut .
*
2017-05-08 10:06:19 +00:00
* Reason : Otherwise we should have running hashes for SHA512 and
* SHA224 in order to satisfy ' weird ' needs from the server
* side .
2012-11-23 12:38:07 +00:00
*/
2017-12-27 21:34:08 +00:00
if ( ssl - > handshake - > ciphersuite_info - > mac = = MBEDTLS_MD_SHA384 )
2012-04-18 14:23:57 +00:00
{
2015-04-08 10:49:31 +00:00
md_alg = MBEDTLS_MD_SHA384 ;
ssl - > out_msg [ 4 ] = MBEDTLS_SSL_HASH_SHA384 ;
2012-04-18 14:23:57 +00:00
}
else
{
2015-04-08 10:49:31 +00:00
md_alg = MBEDTLS_MD_SHA256 ;
ssl - > out_msg [ 4 ] = MBEDTLS_SSL_HASH_SHA256 ;
2012-04-18 14:23:57 +00:00
}
2015-04-08 10:49:31 +00:00
ssl - > out_msg [ 5 ] = mbedtls_ssl_sig_from_pk ( mbedtls_ssl_own_key ( ssl ) ) ;
2012-04-11 12:09:53 +00:00
2013-08-22 12:55:30 +00:00
/* Info from md_alg will be used instead */
hashlen = 0 ;
2012-04-11 12:09:53 +00:00
offset = 2 ;
}
2013-08-27 19:19:20 +00:00
else
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2011-01-18 15:27:19 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " should never happen " ) ) ;
return ( MBEDTLS_ERR_SSL_INTERNAL_ERROR ) ;
2011-01-18 15:27:19 +00:00
}
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2017-08-15 09:49:08 +00:00
if ( ssl - > handshake - > ecrs_enabled )
2017-08-17 12:33:31 +00:00
rs_ctx = & ssl - > handshake - > ecrs_ctx . pk ;
2017-05-17 09:56:15 +00:00
# endif
if ( ( ret = mbedtls_pk_sign_restartable ( mbedtls_ssl_own_key ( ssl ) ,
md_alg , hash_start , hashlen ,
2013-08-21 14:14:26 +00:00
ssl - > out_msg + 6 + offset , & n ,
2017-05-17 09:56:15 +00:00
ssl - > conf - > f_rng , ssl - > conf - > p_rng , rs_ctx ) ) ! = 0 )
2009-01-03 21:22:43 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_pk_sign " , ret ) ;
2020-03-10 11:19:08 +00:00
# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2018-06-13 10:02:12 +00:00
if ( ret = = MBEDTLS_ERR_ECP_IN_PROGRESS )
ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS ;
# endif
2009-01-03 21:22:43 +00:00
return ( ret ) ;
}
2013-08-20 14:50:40 +00:00
ssl - > out_msg [ 4 + offset ] = ( unsigned char ) ( n > > 8 ) ;
ssl - > out_msg [ 5 + offset ] = ( unsigned char ) ( n ) ;
2009-01-03 21:22:43 +00:00
2012-04-11 12:09:53 +00:00
ssl - > out_msglen = 6 + n + offset ;
2015-04-08 10:49:31 +00:00
ssl - > out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE ;
ssl - > out_msg [ 0 ] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY ;
2009-01-03 21:22:43 +00:00
ssl - > state + + ;
2017-09-13 07:38:11 +00:00
if ( ( ret = mbedtls_ssl_write_handshake_msg ( ssl ) ) ! = 0 )
2009-01-03 21:22:43 +00:00
{
2017-09-13 07:38:11 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_write_handshake_msg " , ret ) ;
2009-01-03 21:22:43 +00:00
return ( ret ) ;
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= write certificate verify " ) ) ;
2009-01-03 21:22:43 +00:00
2013-04-18 20:46:23 +00:00
return ( ret ) ;
2009-01-03 21:22:43 +00:00
}
2020-03-10 11:19:08 +00:00
# endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_SESSION_TICKETS)
static int ssl_parse_new_session_ticket ( mbedtls_ssl_context * ssl )
2013-07-31 10:58:16 +00:00
{
2019-12-16 11:46:15 +00:00
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED ;
2013-07-31 10:58:16 +00:00
uint32_t lifetime ;
size_t ticket_len ;
unsigned char * ticket ;
2014-09-10 19:52:12 +00:00
const unsigned char * msg ;
2013-07-31 10:58:16 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " => parse new session ticket " ) ) ;
2013-07-31 10:58:16 +00:00
2018-08-15 12:56:18 +00:00
if ( ( ret = mbedtls_ssl_read_record ( ssl , 1 ) ) ! = 0 )
2013-07-31 10:58:16 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_RET ( 1 , " mbedtls_ssl_read_record " , ret ) ;
2013-07-31 10:58:16 +00:00
return ( ret ) ;
}
2015-04-08 10:49:31 +00:00
if ( ssl - > in_msgtype ! = MBEDTLS_SSL_MSG_HANDSHAKE )
2013-07-31 10:58:16 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad new session ticket message " ) ) ;
2017-05-08 10:06:19 +00:00
mbedtls_ssl_send_alert_message (
ssl ,
MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ) ;
2013-07-31 10:58:16 +00:00
}
/*
* struct {
* uint32 ticket_lifetime_hint ;
* opaque ticket < 0. .2 ^ 16 - 1 > ;
* } NewSessionTicket ;
*
2014-09-10 19:52:12 +00:00
* 0 . 3 ticket_lifetime_hint
* 4 . 5 ticket_len ( n )
* 6 . 5 + n ticket content
2013-07-31 10:58:16 +00:00
*/
2015-04-08 10:49:31 +00:00
if ( ssl - > in_msg [ 0 ] ! = MBEDTLS_SSL_HS_NEW_SESSION_TICKET | |
ssl - > in_hslen < 6 + mbedtls_ssl_hs_hdr_len ( ssl ) )
2013-07-31 10:58:16 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad new session ticket message " ) ) ;
2017-05-03 14:28:34 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET ) ;
2013-07-31 10:58:16 +00:00
}
2015-04-08 10:49:31 +00:00
msg = ssl - > in_msg + mbedtls_ssl_hs_hdr_len ( ssl ) ;
2014-09-10 19:52:12 +00:00
2018-05-11 09:06:29 +00:00
lifetime = ( ( ( uint32_t ) msg [ 0 ] ) < < 24 ) | ( msg [ 1 ] < < 16 ) |
( msg [ 2 ] < < 8 ) | ( msg [ 3 ] ) ;
2013-07-31 10:58:16 +00:00
2014-09-10 19:52:12 +00:00
ticket_len = ( msg [ 4 ] < < 8 ) | ( msg [ 5 ] ) ;
2013-07-31 10:58:16 +00:00
2015-04-08 10:49:31 +00:00
if ( ticket_len + 6 + mbedtls_ssl_hs_hdr_len ( ssl ) ! = ssl - > in_hslen )
2013-07-31 10:58:16 +00:00
{
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " bad new session ticket message " ) ) ;
2017-05-03 14:28:34 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ) ;
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET ) ;
2013-07-31 10:58:16 +00:00
}
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " ticket length: %d " , ticket_len ) ) ;
2013-07-31 10:58:16 +00:00
2013-08-02 11:24:41 +00:00
/* We're not waiting for a NewSessionTicket message any more */
ssl - > handshake - > new_session_ticket = 0 ;
2015-04-08 10:49:31 +00:00
ssl - > state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC ;
2013-08-02 11:24:41 +00:00
2013-07-31 10:58:16 +00:00
/*
* Zero - length ticket means the server changed his mind and doesn ' t want
* to send a ticket after all , so just forget it
*/
2014-06-17 14:39:18 +00:00
if ( ticket_len = = 0 )
2013-07-31 10:58:16 +00:00
return ( 0 ) ;
2019-01-30 14:46:35 +00:00
if ( ssl - > session ! = NULL & & ssl - > session - > ticket ! = NULL )
{
mbedtls_platform_zeroize ( ssl - > session - > ticket ,
ssl - > session - > ticket_len ) ;
mbedtls_free ( ssl - > session - > ticket ) ;
ssl - > session - > ticket = NULL ;
ssl - > session - > ticket_len = 0 ;
}
2018-04-17 14:51:09 +00:00
mbedtls_platform_zeroize ( ssl - > session_negotiate - > ticket ,
ssl - > session_negotiate - > ticket_len ) ;
2015-04-08 10:49:31 +00:00
mbedtls_free ( ssl - > session_negotiate - > ticket ) ;
2013-07-31 10:58:16 +00:00
ssl - > session_negotiate - > ticket = NULL ;
ssl - > session_negotiate - > ticket_len = 0 ;
2015-05-26 14:04:06 +00:00
if ( ( ticket = mbedtls_calloc ( 1 , ticket_len ) ) = = NULL )
2013-07-31 10:58:16 +00:00
{
2015-05-27 14:29:56 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " ticket alloc failed " ) ) ;
2017-05-03 14:28:34 +00:00
mbedtls_ssl_send_alert_message ( ssl , MBEDTLS_SSL_ALERT_LEVEL_FATAL ,
MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ) ;
2015-05-28 07:33:39 +00:00
return ( MBEDTLS_ERR_SSL_ALLOC_FAILED ) ;
2013-07-31 10:58:16 +00:00
}
2014-09-10 19:52:12 +00:00
memcpy ( ticket , msg + 6 , ticket_len ) ;
2013-07-31 10:58:16 +00:00
ssl - > session_negotiate - > ticket = ticket ;
ssl - > session_negotiate - > ticket_len = ticket_len ;
ssl - > session_negotiate - > ticket_lifetime = lifetime ;
/*
* RFC 5077 section 3.4 :
* " If the client receives a session ticket from the server, then it
* discards any Session ID that was sent in the ServerHello . "
*/
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 3 , ( " ticket in use, discarding session id " ) ) ;
2015-06-18 13:50:37 +00:00
ssl - > session_negotiate - > id_len = 0 ;
2013-07-31 10:58:16 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " <= parse new session ticket " ) ) ;
2013-07-31 10:58:16 +00:00
return ( 0 ) ;
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_SESSION_TICKETS */
2013-07-31 10:58:16 +00:00
2009-01-03 21:22:43 +00:00
/*
2013-01-25 13:49:24 +00:00
* SSL handshake - - client side - - single step
2009-01-03 21:22:43 +00:00
*/
2015-04-08 10:49:31 +00:00
int mbedtls_ssl_handshake_client_step ( mbedtls_ssl_context * ssl )
2009-01-03 21:22:43 +00:00
{
int ret = 0 ;
2015-06-24 20:59:30 +00:00
if ( ssl - > state = = MBEDTLS_SSL_HANDSHAKE_OVER | | ssl - > handshake = = NULL )
2015-04-08 10:49:31 +00:00
return ( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ) ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " client state: %d " , ssl - > state ) ) ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
if ( ( ret = mbedtls_ssl_flush_output ( ssl ) ) ! = 0 )
2013-01-25 13:49:24 +00:00
return ( ret ) ;
2009-01-03 21:22:43 +00:00
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_PROTO_DTLS)
2015-05-04 08:55:58 +00:00
if ( ssl - > conf - > transport = = MBEDTLS_SSL_TRANSPORT_DATAGRAM & &
2015-04-08 10:49:31 +00:00
ssl - > handshake - > retransmit_state = = MBEDTLS_SSL_RETRANS_SENDING )
2014-09-19 13:09:21 +00:00
{
2017-09-13 10:45:21 +00:00
if ( ( ret = mbedtls_ssl_flight_transmit ( ssl ) ) ! = 0 )
2014-09-19 13:09:21 +00:00
return ( ret ) ;
}
2018-08-28 09:13:29 +00:00
# endif /* MBEDTLS_SSL_PROTO_DTLS */
2014-09-19 13:09:21 +00:00
2015-04-08 10:49:31 +00:00
/* Change state now, so that it is right in mbedtls_ssl_read_record(), used
2014-09-20 11:54:12 +00:00
* by DTLS for dropping out - of - sequence ChangeCipherSpec records */
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_SESSION_TICKETS)
if ( ssl - > state = = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC & &
2014-09-20 11:54:12 +00:00
ssl - > handshake - > new_session_ticket ! = 0 )
{
2015-04-08 10:49:31 +00:00
ssl - > state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET ;
2014-09-20 11:54:12 +00:00
}
# endif
2013-01-25 13:49:24 +00:00
switch ( ssl - > state )
{
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_HELLO_REQUEST :
ssl - > state = MBEDTLS_SSL_CLIENT_HELLO ;
2009-01-03 21:22:43 +00:00
break ;
2013-01-25 13:49:24 +00:00
/*
* = = > ClientHello
*/
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_CLIENT_HELLO :
2013-01-25 13:49:24 +00:00
ret = ssl_write_client_hello ( ssl ) ;
break ;
/*
* < = = ServerHello
* Certificate
* ( ServerKeyExchange )
* ( CertificateRequest )
* ServerHelloDone
*/
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_SERVER_HELLO :
2013-01-25 13:49:24 +00:00
ret = ssl_parse_server_hello ( ssl ) ;
break ;
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_SERVER_CERTIFICATE :
ret = mbedtls_ssl_parse_certificate ( ssl ) ;
2013-01-25 13:49:24 +00:00
break ;
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_SERVER_KEY_EXCHANGE :
2013-01-25 13:49:24 +00:00
ret = ssl_parse_server_key_exchange ( ssl ) ;
break ;
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_CERTIFICATE_REQUEST :
2013-01-25 13:49:24 +00:00
ret = ssl_parse_certificate_request ( ssl ) ;
break ;
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_SERVER_HELLO_DONE :
2013-01-25 13:49:24 +00:00
ret = ssl_parse_server_hello_done ( ssl ) ;
break ;
/*
* = = > ( Certificate / Alert )
* ClientKeyExchange
* ( CertificateVerify )
* ChangeCipherSpec
* Finished
*/
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_CLIENT_CERTIFICATE :
ret = mbedtls_ssl_write_certificate ( ssl ) ;
2013-01-25 13:49:24 +00:00
break ;
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE :
2013-01-25 13:49:24 +00:00
ret = ssl_write_client_key_exchange ( ssl ) ;
break ;
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_CERTIFICATE_VERIFY :
2013-01-25 13:49:24 +00:00
ret = ssl_write_certificate_verify ( ssl ) ;
break ;
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC :
ret = mbedtls_ssl_write_change_cipher_spec ( ssl ) ;
2013-01-25 13:49:24 +00:00
break ;
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_CLIENT_FINISHED :
ret = mbedtls_ssl_write_finished ( ssl ) ;
2013-01-25 13:49:24 +00:00
break ;
/*
2013-07-31 10:58:16 +00:00
* < = = ( NewSessionTicket )
* ChangeCipherSpec
2013-01-25 13:49:24 +00:00
* Finished
*/
2015-04-08 10:49:31 +00:00
# if defined(MBEDTLS_SSL_SESSION_TICKETS)
case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET :
2014-09-20 11:54:12 +00:00
ret = ssl_parse_new_session_ticket ( ssl ) ;
break ;
2013-08-14 11:48:06 +00:00
# endif
2014-09-20 11:54:12 +00:00
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC :
ret = mbedtls_ssl_parse_change_cipher_spec ( ssl ) ;
2013-01-25 13:49:24 +00:00
break ;
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_SERVER_FINISHED :
ret = mbedtls_ssl_parse_finished ( ssl ) ;
2013-01-25 13:49:24 +00:00
break ;
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_FLUSH_BUFFERS :
MBEDTLS_SSL_DEBUG_MSG ( 2 , ( " handshake: done " ) ) ;
ssl - > state = MBEDTLS_SSL_HANDSHAKE_WRAPUP ;
2013-01-25 13:49:24 +00:00
break ;
2015-04-08 10:49:31 +00:00
case MBEDTLS_SSL_HANDSHAKE_WRAPUP :
mbedtls_ssl_handshake_wrapup ( ssl ) ;
2013-01-25 13:49:24 +00:00
break ;
default :
2015-04-08 10:49:31 +00:00
MBEDTLS_SSL_DEBUG_MSG ( 1 , ( " invalid state %d " , ssl - > state ) ) ;
return ( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ) ;
2013-01-25 13:49:24 +00:00
}
2009-01-03 21:22:43 +00:00
return ( ret ) ;
}
2015-04-08 10:49:31 +00:00
# endif /* MBEDTLS_SSL_CLI_C */