7070/* @todo: which includes are really needed? */
7171#include "mbedtls/entropy.h"
7272#include "mbedtls/ctr_drbg.h"
73- #include "mbedtls/certs.h"
7473#include "mbedtls/x509.h"
7574#include "mbedtls/ssl.h"
7675#include "mbedtls/net_sockets.h"
8180#include "mbedtls/ssl_cache.h"
8281#include "mbedtls/ssl_ticket.h"
8382
84- #include "mbedtls/ssl_internal.h" /* to call mbedtls_flush_output after ERR_MEM */
85-
8683#include <string.h>
8784
8885#ifndef ALTCP_MBEDTLS_ENTROPY_PTR
@@ -109,6 +106,7 @@ struct altcp_tls_config {
109106 u8_t pkey_count ;
110107 u8_t pkey_max ;
111108 mbedtls_x509_crt * ca ;
109+ char host [256 ];
112110#if defined(MBEDTLS_SSL_CACHE_C ) && ALTCP_MBEDTLS_USE_SESSION_CACHE
113111 /** Inter-connection cache for fast connection startup */
114112 struct mbedtls_ssl_cache_context cache ;
@@ -132,6 +130,16 @@ static err_t altcp_mbedtls_lower_recv_process(struct altcp_pcb *conn, altcp_mbed
132130static err_t altcp_mbedtls_handle_rx_appldata (struct altcp_pcb * conn , altcp_mbedtls_state_t * state );
133131static int altcp_mbedtls_bio_send (void * ctx , const unsigned char * dataptr , size_t size );
134132
133+ static void
134+ altcp_mbedtls_flush_output (altcp_mbedtls_state_t * state )
135+ {
136+ if (state -> ssl_context .MBEDTLS_PRIVATE (out_left ) != 0 ) {
137+ int flushed = mbedtls_ssl_send_alert_message (& state -> ssl_context , 0 , 0 );
138+ if (flushed ) {
139+ LWIP_DEBUGF (ALTCP_MBEDTLS_DEBUG , ("mbedtls_ssl_send_alert_message failed: %d\n" , flushed ));
140+ }
141+ }
142+ }
135143
136144/* callback functions from inner/lower connection: */
137145
@@ -524,14 +532,14 @@ altcp_mbedtls_lower_sent(void *arg, struct altcp_pcb *inner_conn, u16_t len)
524532 LWIP_ASSERT ("state" , state != NULL );
525533 LWIP_ASSERT ("pcb mismatch" , conn -> inner_conn == inner_conn );
526534 /* calculate TLS overhead part to not send it to application */
527- overhead = state -> overhead_bytes_adjust + state -> ssl_context .out_left ;
535+ overhead = state -> overhead_bytes_adjust + state -> ssl_context .MBEDTLS_PRIVATE ( out_left ) ;
528536 if ((unsigned )overhead > len ) {
529537 overhead = len ;
530538 }
531539 /* remove ACKed bytes from overhead adjust counter */
532540 state -> overhead_bytes_adjust -= len ;
533541 /* try to send more if we failed before (may increase overhead adjust counter) */
534- mbedtls_ssl_flush_output ( & state -> ssl_context );
542+ altcp_mbedtls_flush_output ( state );
535543 /* remove calculated overhead from ACKed bytes len */
536544 app_len = len - (u16_t )overhead ;
537545 /* update application write counter and inform application */
@@ -559,7 +567,7 @@ altcp_mbedtls_lower_poll(void *arg, struct altcp_pcb *inner_conn)
559567 if (conn -> state ) {
560568 altcp_mbedtls_state_t * state = (altcp_mbedtls_state_t * )conn -> state ;
561569 /* try to send more if we failed before */
562- mbedtls_ssl_flush_output ( & state -> ssl_context );
570+ altcp_mbedtls_flush_output ( state );
563571 if (altcp_mbedtls_handle_rx_appldata (conn , state ) == ERR_ABRT ) {
564572 return ERR_ABRT ;
565573 }
@@ -635,6 +643,7 @@ altcp_mbedtls_setup(void *conf, struct altcp_pcb *conn, struct altcp_pcb *inner_
635643 /* tell mbedtls about our I/O functions */
636644 mbedtls_ssl_set_bio (& state -> ssl_context , conn , altcp_mbedtls_bio_send , altcp_mbedtls_bio_recv , NULL );
637645
646+ mbedtls_ssl_set_hostname (& state -> ssl_context , config -> host );
638647 altcp_mbedtls_setup_callbacks (conn , inner_conn );
639648 conn -> inner_conn = inner_conn ;
640649 conn -> fns = & altcp_mbedtls_functions ;
@@ -683,7 +692,7 @@ altcp_tls_set_session(struct altcp_pcb *conn, struct altcp_tls_session *session)
683692 if (session && conn && conn -> state ) {
684693 altcp_mbedtls_state_t * state = (altcp_mbedtls_state_t * )conn -> state ;
685694 int ret = -1 ;
686- if (session -> data .start )
695+ if (session -> data .MBEDTLS_PRIVATE ( start ) )
687696 ret = mbedtls_ssl_set_session (& state -> ssl_context , & session -> data );
688697 return ret < 0 ? ERR_VAL : ERR_OK ;
689698 }
@@ -776,7 +785,7 @@ altcp_tls_create_config(int is_server, u8_t cert_count, u8_t pkey_count, int hav
776785 struct altcp_tls_config * conf ;
777786 mbedtls_x509_crt * mem ;
778787
779- if (TCP_WND < MBEDTLS_SSL_MAX_CONTENT_LEN ) {
788+ if (TCP_WND < MBEDTLS_SSL_IN_CONTENT_LEN || TCP_WND < MBEDTLS_SSL_OUT_CONTENT_LEN ) {
780789 LWIP_DEBUGF (ALTCP_MBEDTLS_DEBUG |LWIP_DBG_LEVEL_SERIOUS ,
781790 ("altcp_tls: TCP_WND is smaller than the RX decrypion buffer, connection RX might stall!\n" ));
782791 }
@@ -900,7 +909,7 @@ err_t altcp_tls_config_server_add_privkey_cert(struct altcp_tls_config *config,
900909 return ERR_VAL ;
901910 }
902911
903- ret = mbedtls_pk_parse_key (pkey , (const unsigned char * ) privkey , privkey_len , privkey_pass , privkey_pass_len );
912+ ret = mbedtls_pk_parse_key (pkey , (const unsigned char * ) privkey , privkey_len , privkey_pass , privkey_pass_len , mbedtls_ctr_drbg_random , & altcp_tls_entropy_rng -> ctr_drbg );
904913 if (ret != 0 ) {
905914 LWIP_DEBUGF (ALTCP_MBEDTLS_DEBUG , ("mbedtls_pk_parse_public_key failed: %d\n" , ret ));
906915 mbedtls_x509_crt_free (srvcert );
@@ -944,7 +953,7 @@ altcp_tls_create_config_server_privkey_cert(const u8_t *privkey, size_t privkey_
944953}
945954
946955static struct altcp_tls_config *
947- altcp_tls_create_config_client_common (const u8_t * ca , size_t ca_len , int is_2wayauth )
956+ altcp_tls_create_config_client_common (const u8_t * ca , size_t ca_len , int is_2wayauth , char * host )
948957{
949958 int ret ;
950959 struct altcp_tls_config * conf = altcp_tls_create_config (0 , (is_2wayauth ) ? 1 : 0 , (is_2wayauth ) ? 1 : 0 , ca != NULL );
@@ -966,13 +975,15 @@ altcp_tls_create_config_client_common(const u8_t *ca, size_t ca_len, int is_2way
966975
967976 mbedtls_ssl_conf_ca_chain (& conf -> conf , conf -> ca , NULL );
968977 }
978+ strlcpy (conf -> host , host , sizeof (conf -> host ));
979+
969980 return conf ;
970981}
971982
972983struct altcp_tls_config *
973- altcp_tls_create_config_client (const u8_t * ca , size_t ca_len )
984+ altcp_tls_create_config_client (const u8_t * ca , size_t ca_len , char * host )
974985{
975- return altcp_tls_create_config_client_common (ca , ca_len , 0 );
986+ return altcp_tls_create_config_client_common (ca , ca_len , 0 , host );
976987}
977988
978989struct altcp_tls_config *
@@ -988,7 +999,7 @@ altcp_tls_create_config_client_2wayauth(const u8_t *ca, size_t ca_len, const u8_
988999 return NULL ;
9891000 }
9901001
991- conf = altcp_tls_create_config_client_common (ca , ca_len , 1 );
1002+ conf = altcp_tls_create_config_client_common (ca , ca_len , 1 , NULL );
9921003 if (conf == NULL ) {
9931004 return NULL ;
9941005 }
@@ -1003,7 +1014,7 @@ altcp_tls_create_config_client_2wayauth(const u8_t *ca, size_t ca_len, const u8_
10031014 }
10041015
10051016 mbedtls_pk_init (conf -> pkey );
1006- ret = mbedtls_pk_parse_key (conf -> pkey , privkey , privkey_len , privkey_pass , privkey_pass_len );
1017+ ret = mbedtls_pk_parse_key (conf -> pkey , privkey , privkey_len , privkey_pass , privkey_pass_len , mbedtls_ctr_drbg_random , & altcp_tls_entropy_rng -> ctr_drbg );
10071018 if (ret != 0 ) {
10081019 LWIP_DEBUGF (ALTCP_MBEDTLS_DEBUG , ("mbedtls_pk_parse_key failed: %d 0x%x\n" , ret , -1 * ret ));
10091020 altcp_tls_free_config (conf );
@@ -1189,7 +1200,7 @@ altcp_mbedtls_sndbuf(struct altcp_pcb *conn)
11891200 size_t ret ;
11901201#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH )
11911202 /* @todo: adjust ssl_added to real value related to negotiated cipher */
1192- size_t max_frag_len = mbedtls_ssl_get_max_frag_len (& state -> ssl_context );
1203+ size_t max_frag_len = mbedtls_ssl_get_max_in_record_payload (& state -> ssl_context );
11931204 max_len = LWIP_MIN (max_frag_len , max_len );
11941205#endif
11951206 /* Adjust sndbuf of inner_conn with what added by SSL */
@@ -1232,9 +1243,9 @@ altcp_mbedtls_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t
12321243 /* HACK: if there is something left to send, try to flush it and only
12331244 allow sending more if this succeeded (this is a hack because neither
12341245 returning 0 nor MBEDTLS_ERR_SSL_WANT_WRITE worked for me) */
1235- if (state -> ssl_context .out_left ) {
1236- mbedtls_ssl_flush_output ( & state -> ssl_context );
1237- if (state -> ssl_context .out_left ) {
1246+ if (state -> ssl_context .MBEDTLS_PRIVATE ( out_left ) ) {
1247+ altcp_mbedtls_flush_output ( state );
1248+ if (state -> ssl_context .MBEDTLS_PRIVATE ( out_left ) ) {
12381249 return ERR_MEM ;
12391250 }
12401251 }
@@ -1284,6 +1295,8 @@ altcp_mbedtls_bio_send(void *ctx, const unsigned char *dataptr, size_t size)
12841295 while (size_left ) {
12851296 u16_t write_len = (u16_t )LWIP_MIN (size_left , 0xFFFF );
12861297 err_t err = altcp_write (conn -> inner_conn , (const void * )dataptr , write_len , apiflags );
1298+ /* try to send data... */
1299+ altcp_output (conn -> inner_conn );
12871300 if (err == ERR_OK ) {
12881301 written += write_len ;
12891302 size_left -= write_len ;
0 commit comments