Introduce mbedtls_ssl_config_{init,defaults,free}()
diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h
index f94aae8..cb5998d 100644
--- a/include/mbedtls/ssl.h
+++ b/include/mbedtls/ssl.h
@@ -2245,6 +2245,36 @@
void mbedtls_ssl_free( mbedtls_ssl_context *ssl );
/**
+ * \brief Initialize an SSL configuration context
+ * Just makes the context ready for
+ * mbedtls_ssl_config_defaults() or mbedtls_ssl_free()
+ *
+ * \note You need to call mbedtls_ssl_config_defaults() unless you
+ * manually set all of the relevent fields yourself.
+ *
+ * \param conf SSL configuration context
+ */
+void mbedtls_ssl_config_init( mbedtls_ssl_config *conf );
+
+/**
+ * \brief Load reasonnable default SSL configuration values.
+ * (You need to call mbedtls_ssl_config_init() first.)
+ *
+ * \param conf SSL configuration context
+ *
+ * \return 0 if successful, or
+ * MBEDTLS_ERR_XXX_ALLOC_FAILED on memorr allocation error.
+ */
+int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf );
+
+/**
+ * \brief Free an SSL configuration context
+ *
+ * \param conf SSL configuration context
+ */
+void mbedtls_ssl_config_free( mbedtls_ssl_config *conf );
+
+/**
* \brief Initialize SSL session structure
*
* \param session SSL session
diff --git a/library/ssl_tls.c b/library/ssl_tls.c
index 17c6495..48787e6 100644
--- a/library/ssl_tls.c
+++ b/library/ssl_tls.c
@@ -4956,47 +4956,22 @@
int mbedtls_ssl_setup( mbedtls_ssl_context *ssl )
{
int ret;
- int len = MBEDTLS_SSL_BUFFER_LEN;
+ const size_t len = MBEDTLS_SSL_BUFFER_LEN;
+ /*
+ * Temporary, WIP
+ */
ssl->conf = mbedtls_malloc( sizeof( mbedtls_ssl_config ) );
if( ssl->conf == NULL )
return( MBEDTLS_ERR_SSL_MALLOC_FAILED );
- memset( ssl->conf, 0, sizeof( mbedtls_ssl_config ) );
-
- /*
- * Sane defaults
- */
- ssl->conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
- ssl->conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_1; /* TLS 1.0 */
- ssl->conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
- ssl->conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
-
- mbedtls_ssl_set_ciphersuites( ssl, mbedtls_ssl_list_ciphersuites() );
-
- mbedtls_ssl_set_arc4_support( ssl, MBEDTLS_SSL_ARC4_DISABLED );
-
-#if defined(MBEDTLS_SSL_RENEGOTIATION)
- ssl->conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;
- memset( ssl->conf->renego_period, 0xFF, 7 );
- ssl->conf->renego_period[7] = 0x00;
-#endif
-
-#if defined(MBEDTLS_DHM_C)
- if( ( ret = mbedtls_mpi_read_string( &ssl->conf->dhm_P, 16,
- MBEDTLS_DHM_RFC5114_MODP_1024_P) ) != 0 ||
- ( ret = mbedtls_mpi_read_string( &ssl->conf->dhm_G, 16,
- MBEDTLS_DHM_RFC5114_MODP_1024_G) ) != 0 )
- {
- MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_mpi_read_string", ret );
- return( ret );
- }
-#endif
+ mbedtls_ssl_config_init( ssl->conf );
+ mbedtls_ssl_config_defaults( ssl->conf );
/*
* Prepare base structures
*/
- if( ( ssl->in_buf = mbedtls_malloc( len ) ) == NULL ||
+ if( ( ssl-> in_buf = mbedtls_malloc( len ) ) == NULL ||
( ssl->out_buf = mbedtls_malloc( len ) ) == NULL )
{
MBEDTLS_SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
@@ -5005,41 +4980,8 @@
return( MBEDTLS_ERR_SSL_MALLOC_FAILED );
}
- memset( ssl-> in_buf, 0, MBEDTLS_SSL_BUFFER_LEN );
- memset( ssl->out_buf, 0, MBEDTLS_SSL_BUFFER_LEN );
-
- /* No error is possible, MBEDTLS_SSL_TRANSPORT_STREAM always valid */
- (void) mbedtls_ssl_set_transport( ssl, MBEDTLS_SSL_TRANSPORT_STREAM );
-
-#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
- ssl->conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
-#endif
-
-#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
- ssl->conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
-#endif
-
-#if defined(MBEDTLS_SSL_SESSION_TICKETS)
- ssl->conf->ticket_lifetime = MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME;
-#endif
-
-#if defined(MBEDTLS_SSL_SET_CURVES)
- ssl->conf->curve_list = mbedtls_ecp_grp_id_list( );
-#endif
-
-#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
- ssl->conf->f_cookie_write = ssl_cookie_write_dummy;
- ssl->conf->f_cookie_check = ssl_cookie_check_dummy;
-#endif
-
-#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
- ssl->conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;
-#endif
-
-#if defined(MBEDTLS_SSL_PROTO_DTLS)
- ssl->conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;
- ssl->conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;
-#endif
+ memset( ssl-> in_buf, 0, len );
+ memset( ssl->out_buf, 0, len );
if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
return( ret );
@@ -6637,11 +6579,6 @@
}
#endif
-#if defined(MBEDTLS_DHM_C)
- mbedtls_mpi_free( &ssl->conf->dhm_P );
- mbedtls_mpi_free( &ssl->conf->dhm_G );
-#endif
-
if( ssl->transform )
{
mbedtls_ssl_transform_free( ssl->transform );
@@ -6682,22 +6619,6 @@
}
#endif
-#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
- if( ssl->conf->psk != NULL )
- {
- mbedtls_zeroize( ssl->conf->psk, ssl->conf->psk_len );
- mbedtls_zeroize( ssl->conf->psk_identity, ssl->conf->psk_identity_len );
- mbedtls_free( ssl->conf->psk );
- mbedtls_free( ssl->conf->psk_identity );
- ssl->conf->psk_len = 0;
- ssl->conf->psk_identity_len = 0;
- }
-#endif
-
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
- ssl_key_cert_free( ssl->conf->key_cert );
-#endif
-
#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
if( mbedtls_ssl_hw_record_finish != NULL )
{
@@ -6710,12 +6631,126 @@
mbedtls_free( ssl->cli_id );
#endif
+ /* Temporary, WIP */
+ mbedtls_ssl_config_free( ssl->conf );
+ mbedtls_free( ssl->conf );
+
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= free" ) );
/* Actually clear after last debug message */
mbedtls_zeroize( ssl, sizeof( mbedtls_ssl_context ) );
}
+/*
+ * Initialze mbedtls_ssl_config
+ */
+void mbedtls_ssl_config_init( mbedtls_ssl_config *conf )
+{
+ memset( conf, 0, sizeof( mbedtls_ssl_config ) );
+}
+
+/*
+ * Load default in mbetls_ssl_config
+ */
+int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf )
+{
+ int ret;
+
+ conf->transport = MBEDTLS_SSL_TRANSPORT_STREAM;
+
+ conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
+ conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_1; /* TLS 1.0 */
+ conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
+ conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
+
+ conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =
+ conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =
+ conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =
+ conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =
+ mbedtls_ssl_list_ciphersuites();
+
+ conf->arc4_disabled = MBEDTLS_SSL_ARC4_DISABLED;
+
+#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
+ conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
+#endif
+
+#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
+ conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
+#endif
+
+#if defined(MBEDTLS_SSL_SESSION_TICKETS)
+ conf->ticket_lifetime = MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME;
+#endif
+
+#if defined(MBEDTLS_SSL_SET_CURVES)
+ conf->curve_list = mbedtls_ecp_grp_id_list( );
+#endif
+
+#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
+ conf->f_cookie_write = ssl_cookie_write_dummy;
+ conf->f_cookie_check = ssl_cookie_check_dummy;
+#endif
+
+#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
+ conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;
+#endif
+
+#if defined(MBEDTLS_SSL_PROTO_DTLS)
+ conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;
+ conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;
+#endif
+
+#if defined(MBEDTLS_SSL_RENEGOTIATION)
+ conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;
+ memset( conf->renego_period, 0xFF, 7 );
+ conf->renego_period[7] = 0x00;
+#endif
+
+#if defined(MBEDTLS_DHM_C)
+ if( ( ret = mbedtls_mpi_read_string( &conf->dhm_P, 16,
+ MBEDTLS_DHM_RFC5114_MODP_1024_P) ) != 0 ||
+ ( ret = mbedtls_mpi_read_string( &conf->dhm_G, 16,
+ MBEDTLS_DHM_RFC5114_MODP_1024_G) ) != 0 )
+ {
+ mbedtls_mpi_free( &conf->dhm_P );
+ mbedtls_mpi_free( &conf->dhm_G );
+ return( ret );
+ }
+#endif
+
+ return( 0 );
+}
+
+/*
+ * Free mbedtls_ssl_config
+ */
+void mbedtls_ssl_config_free( mbedtls_ssl_config *conf )
+{
+#if defined(MBEDTLS_DHM_C)
+ mbedtls_mpi_free( &conf->dhm_P );
+ mbedtls_mpi_free( &conf->dhm_G );
+#endif
+
+#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
+ if( conf->psk != NULL )
+ {
+ mbedtls_zeroize( conf->psk, conf->psk_len );
+ mbedtls_zeroize( conf->psk_identity, conf->psk_identity_len );
+ mbedtls_free( conf->psk );
+ mbedtls_free( conf->psk_identity );
+ conf->psk_len = 0;
+ conf->psk_identity_len = 0;
+ }
+#endif
+
+#if defined(MBEDTLS_X509_CRT_PARSE_C)
+ ssl_key_cert_free( conf->key_cert );
+#endif
+
+ mbedtls_zeroize( conf, sizeof( mbedtls_ssl_config ) );
+}
+
#if defined(MBEDTLS_PK_C)
/*
* Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX