Hello,
I’m trying to perform a secure connection to an Amazon server (s3 bucket AWS) from the STM32F769I-DISCO evaluation board.
My code is the following:
#if !defined(MBEDTLS_CONFIG_FILE)
#include “mbedtls/config.h”
#else
#include MBEDTLS_CONFIG_FILE
#endif
#if defined(MBEDTLS_PLATFORM_C)
#include “mbedtls/platform.h”
#else
#include <stdio.h>
#include <stdlib.h>
#define mbedtls_time time
#define mbedtls_time_t time_t
#define mbedtls_fprintf fprintf
#define mbedtls_printf printf
#endif
#include “mbedtls/net_sockets.h”
#include “mbedtls/debug.h”
#include “mbedtls/ssl.h”
#include “mbedtls/entropy.h”
#include “mbedtls/ctr_drbg.h”
#include “mbedtls/error.h”
#include “mbedtls/certs.h”
#include “mbedtls/memory_buffer_alloc.h”
#include “main.h”
#include “cmsis_os.h”
#include <string.h>
static mbedtls_net_context server_fd;
static uint32_t flags;
static uint8_t buf[1024];
static const uint8_t *pers = “ssl_client”;
static uint8_t vrfy_buf[512];
const char *temp;
static int ret;
mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_ssl_context ssl;
mbedtls_ssl_config conf;
mbedtls_x509_crt cacert;
/* use static allocation to keep the heap size as low as possible */
#ifdef MBEDTLS_MEMORY_BUFFER_ALLOC_C
uint8_t memory_buf[MAX_MEM_SIZE];
#endif
void SSL_Client(void const *argument)
{
int len;
/*
-
- Initialize the RNG and the session data
*/
#ifdef MBEDTLS_MEMORY_BUFFER_ALLOC_C
mbedtls_memory_buffer_alloc_init(memory_buf, sizeof(memory_buf));
#endif
mbedtls_net_init(NULL);
mbedtls_ssl_init(&ssl);
mbedtls_ssl_config_init(&conf);
mbedtls_x509_crt_init(&cacert);
mbedtls_ctr_drbg_init(&ctr_drbg);
- Initialize the RNG and the session data
mbedtls_printf( “\n . Seeding the random number generator…” );
mbedtls_entropy_init( &entropy );
len = strlen((char *)pers);
if((ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *) pers, len)) != 0)
{
mbedtls_printf( " failed\n ! mbedtls_ctr_drbg_seed returned %d\n", ret );
goto exit;
}
mbedtls_printf( " ok\n" );
/*
-
- Initialize certificates
*/
mbedtls_printf( " . Loading the CA root certificate …" );
- Initialize certificates
ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_cas_pem, mbedtls_test_cas_pem_len );
if( ret < 0 )
{
mbedtls_printf( " failed\n ! mbedtls_x509_crt_parse returned -0x%x\n\n", -ret );
goto exit;
}
mbedtls_printf( " ok (%d skipped)\n", ret );
mbedtls_printf( " CA = %s\n", mbedtls_test_cas_pem );
/*
-
- Start the connection
*/
mbedtls_printf( " . Connecting to tcp/%s/%s…", SERVER_NAME, SERVER_PORT );
- Start the connection
if((ret = mbedtls_net_connect(&server_fd, SERVER_NAME, SERVER_PORT, MBEDTLS_NET_PROTO_TCP)) != 0)
{
mbedtls_printf( " failed\n ! mbedtls_net_connect returned %d\n\n", ret );
goto exit;
}
mbedtls_printf( " ok\n" );
/*
-
- Setup stuff
*/
mbedtls_printf( " . Setting up the SSL/TLS structure…" );
- Setup stuff
if((ret = mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT)) != 0)
{
mbedtls_printf( " failed\n ! mbedtls_ssl_config_defaults returned %d\n\n", ret );
goto exit;
}
mbedtls_printf( " ok\n" );
/* OPTIONAL is not optimal for security,
- but makes interop easier in this simplified example */
mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_OPTIONAL );
mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL );
mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );
if((ret = mbedtls_ssl_setup(&ssl, &conf)) != 0)
{
mbedtls_printf( " failed\n ! mbedtls_ssl_setup returned %d\n\n", ret );
goto exit;
}
if((ret = mbedtls_ssl_set_hostname( &ssl, “localhost” )) != 0)
{
mbedtls_printf( " failed\n ! mbedtls_ssl_set_hostname returned %d\n\n", ret );
goto exit;
}
mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);
/*
-
- Handshake
*/
mbedtls_printf( " . Performing the SSL/TLS handshake…" );
- Handshake
while((ret = mbedtls_ssl_handshake( &ssl )) != 0)
{
if(ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE)
{
mbedtls_printf( " failed\n ! mbedtls_ssl_handshake returned -0x%x\n\n", -ret );
temp = mbedtls_ssl_get_version(&ssl);
goto exit;
}
}
mbedtls_printf( " ok\n" );
/*
-
- Verify the server certificate
*/
mbedtls_printf( " . Verifying peer X.509 certificate…" );
- Verify the server certificate
if(( flags = mbedtls_ssl_get_verify_result( &ssl )) != 0)
{
mbedtls_printf( " failed\n" );
mbedtls_x509_crt_verify_info((char *)vrfy_buf, sizeof( vrfy_buf ), " ! ", flags);
mbedtls_printf( "%s\n", vrfy_buf );
}
else
{
mbedtls_printf( " ok\n" );
}
/*
-
- Write the GET request
*/
- Write the GET request
mbedtls_printf( " > Write to server:" );
sprintf((char *) buf, PUT_REQUEST);
len = strlen((char *) buf);
while((ret = mbedtls_ssl_write(&ssl, buf, len)) <= 0)
{
if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )
{
mbedtls_printf( " failed\n ! mbedtls_ssl_write returned %d\n\n", ret );
goto exit;
}
}
len = ret;
mbedtls_printf(" %d bytes written\n\n%s", len, (char *) buf);
/*
-
- Read the HTTP response
*/
mbedtls_printf(" < Read from server:");
- Read the HTTP response
do
{
len = sizeof( buf ) - 1;
memset( buf, 0, sizeof( buf ) );
ret = mbedtls_ssl_read( &ssl, buf, len );
if(ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE)
{
continue;
}
if(ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY)
{
break;
}
if(ret < 0)
{
mbedtls_printf( "failed\n ! mbedtls_ssl_read returned %d\n\n", ret );
break;
}
if(ret == 0)
{
mbedtls_printf( "\n\nEOF\n\n" );
break;
}
len = ret;
mbedtls_printf( " %d bytes read\n\n%s", len, (char *) buf );
}
while(1);
mbedtls_ssl_close_notify( &ssl );
exit:
mbedtls_net_free( &server_fd );
mbedtls_x509_crt_free( &cacert );
mbedtls_ssl_free( &ssl );
mbedtls_ssl_config_free( &conf );
mbedtls_ctr_drbg_free( &ctr_drbg );
mbedtls_entropy_free( &entropy );
if ((ret < 0) && (ret != MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY))
{
Error_Handler();
}
else
{
Success_Handler();
}
}
The error is always in the SSL/TLS handshake returning aN -0x7200 error. The strange for me is that I can do the same connection to other type of servers as for example google.com and the handshake is correctly done.
I thought that maybe is something about client and server TLS versions and I have changed the version of the client to TLSv.1.2 but I have the same error.
Why is SSL/TLS handhsaking returning this error? What can I change/configure to solve it?
I’m very very new in this world and some help will very appreciated.
In advance, thank you.