diff --git a/IDE/VS-AZURE-SPHERE/README.md b/IDE/VS-AZURE-SPHERE/README.md index abfcb6be0..2c6d7621b 100644 --- a/IDE/VS-AZURE-SPHERE/README.md +++ b/IDE/VS-AZURE-SPHERE/README.md @@ -9,27 +9,33 @@ Each project uses `user_settings.h` for to enable and disable features. ### Set Up Steps -0. Open the wolfssl Microsoft Visual Studio Solution +0. Setup your Azure Sphere device. + [Install Azure Sphere](https://docs.microsoft.com/en-us/azure-sphere/install/install) + [Set up an account](https://docs.microsoft.com/en-us/azure-sphere/install/azure-directory-account) + [Claim your device](https://docs.microsoft.com/en-us/azure-sphere/install/claim-device) + [Configure networking](https://docs.microsoft.com/en-us/azure-sphere/install/configure-wifi) -1. Build All the Projects +1. Open the wolfssl Microsoft Visual Studio Solution + +2. Build All the Projects + Right Click: `Solution 'wolfssl' (4 of 4 projects)` + Click: `Build Solution` -2. Connect your Azure Sphere MT3620 Development Board using USB. +3. Connect your Azure Sphere MT3620 Development Board using USB. -3. Run the wolfCrypt Library Test +4. Run the wolfCrypt Library Test + Right Click: `wolfcrypt_test (Azure Sphere)` + Click: `Debug->'Start new instance'.` -4. Wait for the wolfCrypt Library Test to finish. +5. Wait for the wolfCrypt Library Test to finish. -5. Test the client. +6. Test the client. + Run client(Azure Sphere) using: `Debug->'Start new instance'` It's OK if the HTTP GET request returns an error. The TLS connection was successful. -6. Test the server. +7. Test the server. + Run server(Azure Sphere) using: `Debug->'Start new instance'` + Run the following wolfSSL example client command inside wolfssl directory. diff --git a/IDE/VS-AZURE-SPHERE/client/app_manifest.json b/IDE/VS-AZURE-SPHERE/client/app_manifest.json index ce81b35ac..2156a81a3 100644 --- a/IDE/VS-AZURE-SPHERE/client/app_manifest.json +++ b/IDE/VS-AZURE-SPHERE/client/app_manifest.json @@ -6,7 +6,7 @@ "CmdArgs": [], "Capabilities": { "AllowedConnections": [ - "151.101.26.217", + "www.wolfssl.com", "192.168.1.128", "192.168.1.150", "192.168.1.200", diff --git a/IDE/VS-AZURE-SPHERE/client/client.c b/IDE/VS-AZURE-SPHERE/client/client.c index 2b33a7a57..e66ee2ede 100644 --- a/IDE/VS-AZURE-SPHERE/client/client.c +++ b/IDE/VS-AZURE-SPHERE/client/client.c @@ -40,17 +40,25 @@ #include #include +static void client_Cleanup(int sockfd, WOLFSSL_CTX* ctx, WOLFSSL* ssl) +{ + wolfSSL_free(ssl); /* Free the wolfSSL object */ + wolfSSL_CTX_free(ctx); /* Free the wolfSSL context object */ + wolfSSL_Cleanup(); /* Cleanup the wolfSSL environment */ + close(sockfd); /* Close the connection to the server */ +} + int main(int argc, char** argv) { bool isNetworkingReady = false; - int sockfd; - struct sockaddr_in servAddr; + SOCKET_T sockfd = 0; char buff[256]; size_t len; + int ret; /* declare wolfSSL objects */ - WOLFSSL_CTX* ctx; - WOLFSSL* ssl; + WOLFSSL_CTX* ctx = NULL; + WOLFSSL* ssl = NULL; /* Check if the Azure Sphere Dev Board has network connectivity. */ if ((Networking_IsNetworkingReady(&isNetworkingReady) < 0) || !isNetworkingReady) { @@ -58,53 +66,35 @@ int main(int argc, char** argv) return -1; } - /* Initialize wolfSSL */ - wolfSSL_Init(); - - /* Create a socket that uses an internet IPv4 address, - * Sets the socket to be stream based (TCP), - * 0 means choose the default protocol. */ - if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { - fprintf(stderr, "ERROR: failed to create the socket\n"); + ret = wolfIO_TcpConnect(&sockfd, SERVER_IP, DEFAULT_PORT, 0); + if ((ret != 0) || ((int)sockfd < 0)) { + fprintf(stderr, "ERROR: failed to create socket."); return -1; } + /* Initialize wolfSSL */ + wolfSSL_Init(); + /* Create and initialize WOLFSSL_CTX */ - if ((ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())) == NULL) { + ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method()); + if (ctx == NULL) { fprintf(stderr, "ERROR: failed to create WOLFSSL_CTX\n"); + client_Cleanup(sockfd,ctx,ssl); return -1; } /* Load client certificates into WOLFSSL_CTX */ - if (wolfSSL_CTX_load_verify_buffer(ctx, CERT, SIZEOF_CERT, WOLFSSL_FILETYPE_ASN1) - != SSL_SUCCESS) { + ret = wolfSSL_CTX_load_verify_buffer(ctx, CERT, SIZEOF_CERT, WOLFSSL_FILETYPE_ASN1); + if (ret != SSL_SUCCESS) { fprintf(stderr, "ERROR: failed to load %s, please check the buffer.\n"); - return -1; - } - - /* Initialize the server address struct with zeros */ - memset(&servAddr, 0, sizeof(servAddr)); - - /* Fill in the server address */ - servAddr.sin_family = AF_INET; /* using IPv4 */ - servAddr.sin_port = htons(DEFAULT_PORT); /* on DEFAULT_PORT */ - - /* Get the server IPv4 address from SERVER_IP in user_settings.h */ - if (inet_pton(AF_INET, SERVER_IP, &servAddr.sin_addr) != 1) { - fprintf(stderr, "ERROR: invalid address\n"); - return -1; - } - - /* Connect to the server */ - if (connect(sockfd, (struct sockaddr*) & servAddr, sizeof(servAddr)) - == -1) { - fprintf(stderr, "ERROR: failed to connect\n"); + client_Cleanup(sockfd,ctx,ssl); return -1; } /* Create a WOLFSSL object */ if ((ssl = wolfSSL_new(ctx)) == NULL) { fprintf(stderr, "ERROR: failed to create WOLFSSL object\n"); + client_Cleanup(sockfd,ctx,ssl); return -1; } @@ -114,6 +104,7 @@ int main(int argc, char** argv) /* Connect to wolfSSL on the server side */ if (wolfSSL_connect(ssl) != SSL_SUCCESS) { fprintf(stderr, "ERROR: failed to connect to wolfSSL\n"); + client_Cleanup(sockfd,ctx,ssl); return -1; } @@ -124,6 +115,7 @@ int main(int argc, char** argv) /* Send the message to the server */ if (wolfSSL_write(ssl, msg, (int)len) != len) { fprintf(stderr, "ERROR: failed to write\n"); + client_Cleanup(sockfd,ctx,ssl); return -1; } @@ -131,6 +123,7 @@ int main(int argc, char** argv) memset(buff, 0, sizeof(buff)); if (wolfSSL_read(ssl, buff, sizeof(buff) - 1) == -1) { fprintf(stderr, "ERROR: failed to read\n"); + client_Cleanup(sockfd,ctx,ssl); return -1; } @@ -138,9 +131,6 @@ int main(int argc, char** argv) printf("Server Reply: %s\n", buff); /* Cleanup and return */ - wolfSSL_free(ssl); /* Free the wolfSSL object */ - wolfSSL_CTX_free(ctx); /* Free the wolfSSL context object */ - wolfSSL_Cleanup(); /* Cleanup the wolfSSL environment */ - close(sockfd); /* Close the connection to the server */ - return 0; /* Return reporting a success */ + client_Cleanup(sockfd,ctx,ssl); + return 0; /* Return reporting a success */ } diff --git a/IDE/VS-AZURE-SPHERE/server/server.c b/IDE/VS-AZURE-SPHERE/server/server.c index c689ace72..784f47bb9 100644 --- a/IDE/VS-AZURE-SPHERE/server/server.c +++ b/IDE/VS-AZURE-SPHERE/server/server.c @@ -45,6 +45,14 @@ #define KEY_BUF server_key_der_2048 #define SIZEOF_KEY_BUF sizeof_server_key_der_2048 +static void server_Cleanup(int sockfd, WOLFSSL_CTX* ctx, WOLFSSL* ssl) +{ + wolfSSL_free(ssl); /* Free the wolfSSL object */ + wolfSSL_CTX_free(ctx); /* Free the wolfSSL context object */ + wolfSSL_Cleanup(); /* Cleanup the wolfSSL environment */ + close(sockfd); /* Close the socket listening for clients */ +} + int main(void) { bool isNetworkingReady = false; @@ -60,8 +68,8 @@ int main(void) const char* reply = "I hear ya fa shizzle!\n"; /* declare wolfSSL objects */ - WOLFSSL_CTX* ctx; - WOLFSSL* ssl; + WOLFSSL_CTX* ctx = NULL; + WOLFSSL* ssl = NULL; /* Check if the Azure Sphere Dev Board has network connectivity. */ if ((Networking_IsNetworkingReady(&isNetworkingReady) < 0) || !isNetworkingReady) { @@ -77,12 +85,14 @@ int main(void) * 0 means choose the default protocol. */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "ERROR: failed to create the socket\n"); + server_Cleanup(sockfd, ctx, ssl); return -1; } /* Create and initialize WOLFSSL_CTX */ if ((ctx = wolfSSL_CTX_new(wolfTLSv1_2_server_method())) == NULL) { fprintf(stderr, "ERROR: failed to create WOLFSSL_CTX\n"); + server_Cleanup(sockfd, ctx, ssl); return -1; } @@ -91,6 +101,7 @@ int main(void) != SSL_SUCCESS) { fprintf(stderr, "ERROR: failed to load %s, please check the file.\n", CERT_BUF); + server_Cleanup(sockfd, ctx, ssl); return -1; } @@ -99,6 +110,7 @@ int main(void) != SSL_SUCCESS) { fprintf(stderr, "ERROR: failed to load %s, please check the file.\n", KEY_BUF); + server_Cleanup(sockfd, ctx, ssl); return -1; } @@ -113,12 +125,14 @@ int main(void) /* Bind the server socket to our port */ if (bind(sockfd, (struct sockaddr*)&servAddr, sizeof(servAddr)) == -1) { fprintf(stderr, "ERROR: failed to bind\n"); + server_Cleanup(sockfd, ctx, ssl); return -1; } /* Listen for a new connection, allow 5 pending connections */ if (listen(sockfd, 5) == -1) { fprintf(stderr, "ERROR: failed to listen\n"); + server_Cleanup(sockfd, ctx, ssl); return -1; } @@ -130,12 +144,14 @@ int main(void) if ((connd = accept(sockfd, (struct sockaddr*)&clientAddr, &size)) == -1) { fprintf(stderr, "ERROR: failed to accept the connection\n\n"); + server_Cleanup(sockfd, ctx, ssl); return -1; } /* Create a WOLFSSL object */ if ((ssl = wolfSSL_new(ctx)) == NULL) { fprintf(stderr, "ERROR: failed to create WOLFSSL object\n"); + server_Cleanup(sockfd, ctx, ssl); return -1; } @@ -147,6 +163,7 @@ int main(void) if (ret != SSL_SUCCESS) { fprintf(stderr, "wolfSSL_accept error = %d\n", wolfSSL_get_error(ssl, ret)); + server_Cleanup(sockfd, ctx, ssl); return -1; } @@ -156,6 +173,7 @@ int main(void) memset(buff, 0, sizeof(buff)); if (wolfSSL_read(ssl, buff, sizeof(buff)-1) == -1) { fprintf(stderr, "ERROR: failed to read\n"); + server_Cleanup(sockfd, ctx, ssl); return -1; } @@ -176,6 +194,7 @@ int main(void) /* Reply back to the client */ if (wolfSSL_write(ssl, buff, (int)len) != len) { fprintf(stderr, "ERROR: failed to write\n"); + server_Cleanup(sockfd, ctx, ssl); return -1; } @@ -187,8 +206,6 @@ int main(void) printf("Shutdown complete\n"); /* Cleanup and return */ - wolfSSL_CTX_free(ctx); /* Free the wolfSSL context object */ - wolfSSL_Cleanup(); /* Cleanup the wolfSSL environment */ - close(sockfd); /* Close the socket listening for clients */ + server_Cleanup(sockfd, ctx, ssl); return 0; /* Return reporting a success */ } diff --git a/IDE/VS-AZURE-SPHERE/user_settings.h b/IDE/VS-AZURE-SPHERE/user_settings.h index 0178ead1c..b3a34a7af 100644 --- a/IDE/VS-AZURE-SPHERE/user_settings.h +++ b/IDE/VS-AZURE-SPHERE/user_settings.h @@ -2,7 +2,6 @@ #define _USER_SETTINGS_H_ #define WOLFSSL_AZSPHERE - /* Client connects to the server with these details. */ #ifdef CUSTOM_SERVER_CONNECTION #ifndef SERVER_IP @@ -14,7 +13,7 @@ static const char msg[] = "Are you listening wolfSSL Server?"; #else #ifndef SERVER_IP - #define SERVER_IP "151.101.26.217" /* www.wolfssl.com */ + #define SERVER_IP "www.wolfssl.com" #endif #define CERT wolfssl_website_root_ca #define SIZEOF_CERT sizeof_wolfssl_website_root_ca @@ -63,4 +62,7 @@ /* Filesystem */ #define NO_FILESYSTEM +/* Debug */ +#define WOLFIO_DEBUG + #endif /* _USER_SETTINGS_H_ */