diff --git a/IDE/ARDUINO/README.md b/IDE/ARDUINO/README.md index da14ddf56..818d3b55f 100644 --- a/IDE/ARDUINO/README.md +++ b/IDE/ARDUINO/README.md @@ -23,4 +23,6 @@ If building for Intel Galileo platform also uncomment the define for `INTEL_GALI `IDE/ARDUNIO/wolfSSL` folder. - In `Sketch -> Include Library` choose wolfSSL. -An example wolfSSL client INO sketch exists here: `sketches/wolfssl_client/wolfssl_client.ino` +2. Open an example Arduino sketch for wolfSSL: + - wolfSSL Client INO sketch: `sketches/wolfssl_client/wolfssl_client.ino` + - wolfSSL Server INO sketch: `sketches/wolfssl_server/wolfssl_server.ino` diff --git a/IDE/ARDUINO/include.am b/IDE/ARDUINO/include.am index 01b2d32fb..19189e82b 100644 --- a/IDE/ARDUINO/include.am +++ b/IDE/ARDUINO/include.am @@ -4,5 +4,5 @@ EXTRA_DIST+= IDE/ARDUINO/README.md EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino +EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino EXTRA_DIST+= IDE/ARDUINO/wolfssl-arduino.sh - diff --git a/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino b/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino index f657df9db..5e45a4cb0 100644 --- a/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino +++ b/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino @@ -25,7 +25,7 @@ #include const char host[] = "192.168.1.148"; // server to connect to -int port = 11111; // port on server to connect to +const int port = 11111; // port on server to connect to int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx); int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx); @@ -79,7 +79,6 @@ int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx) { void loop() { int err = 0; int input = 0; - int sent = 0; int total_input = 0; char msg[32] = "hello wolfssl!"; int msgSz = (int)strlen(msg); @@ -89,6 +88,7 @@ void loop() { if (reconnect) { reconnect--; + if (client.connect(host, port)) { Serial.print("Connected to "); @@ -97,53 +97,53 @@ void loop() { ssl = wolfSSL_new(ctx); if (ssl == NULL) { Serial.println("Unable to allocate SSL object"); + return; } - else { - err = wolfSSL_connect(ssl); - if (err != WOLFSSL_SUCCESS) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Connect Error: "); - Serial.println(errBuf); - } - Serial.print("SSL version is "); - Serial.println(wolfSSL_get_version(ssl)); - - cipherName = wolfSSL_get_cipher(ssl); - Serial.print("SSL cipher suite is "); - Serial.println(cipherName); - - if ((wolfSSL_write(ssl, msg, msgSz)) == msgSz) { - - Serial.print("Server response: "); - while (client.available() || wolfSSL_pending(ssl)) { - input = wolfSSL_read(ssl, reply, sizeof(reply) - 1); - total_input += input; - if (input < 0) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Read Error: "); - Serial.println(errBuf); - break; - } else if (input > 0) { - reply[input] = '\0'; - Serial.print(reply); - } else { - Serial.println(); - } - } - } else { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Write Error: "); - Serial.println(errBuf); - } - - wolfSSL_shutdown(ssl); - wolfSSL_free(ssl); + err = wolfSSL_connect(ssl); + if (err != WOLFSSL_SUCCESS) { + err = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(err, errBuf); + Serial.print("TLS Connect Error: "); + Serial.println(errBuf); } + Serial.print("SSL version is "); + Serial.println(wolfSSL_get_version(ssl)); + + cipherName = wolfSSL_get_cipher(ssl); + Serial.print("SSL cipher suite is "); + Serial.println(cipherName); + + if ((wolfSSL_write(ssl, msg, msgSz)) == msgSz) { + + Serial.print("Server response: "); + while (client.available() || wolfSSL_pending(ssl)) { + input = wolfSSL_read(ssl, reply, sizeof(reply) - 1); + total_input += input; + if (input < 0) { + err = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(err, errBuf); + Serial.print("TLS Read Error: "); + Serial.println(errBuf); + break; + } else if (input > 0) { + reply[input] = '\0'; + Serial.print(reply); + } else { + Serial.println(); + } + } + } else { + err = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(err, errBuf); + Serial.print("TLS Write Error: "); + Serial.println(errBuf); + } + + wolfSSL_shutdown(ssl); + wolfSSL_free(ssl); + client.stop(); Serial.println("Connection complete."); reconnect = 0; diff --git a/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino b/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino new file mode 100644 index 000000000..0a71322d8 --- /dev/null +++ b/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino @@ -0,0 +1,152 @@ +/* wolfssl_server.ino + * + * Copyright (C) 2006-2018 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +#include +#include +#include + +const int port = 11111; // port to listen on + +int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx); +int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx); + +EthernetServer server(port); +EthernetClient client; + +WOLFSSL_CTX* ctx = 0; +WOLFSSL* ssl = 0; +WOLFSSL_METHOD* method = 0; + +void setup() { + Serial.begin(9600); + + method = wolfTLSv1_2_server_method(); + if (method == NULL) { + Serial.println("unable to get method"); + return; + } + ctx = wolfSSL_CTX_new(method); + if (ctx == NULL) { + Serial.println("unable to get ctx"); + return; + } + // initialize wolfSSL using callback functions + wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); + wolfSSL_SetIOSend(ctx, EthernetSend); + wolfSSL_SetIORecv(ctx, EthernetReceive); + + // Start the server + server.begin(); + + return; +} + +int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx) { + int sent = 0; + + sent = client.write((byte*)msg, sz); + + return sent; +} + +int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx) { + int ret = 0; + + while (client.available() > 0 && ret < sz) { + reply[ret++] = client.read(); + } + + return ret; +} + +void loop() { + int err = 0; + int input = 0; + char errBuf[80]; + char reply[80]; + int replySz = 0; + const char* cipherName; + + // Listen for incoming client requests. + client = server.available(); + if (!client) { + return; + } + + if (client.connected()) { + + Serial.println("Client connected"); + + ssl = wolfSSL_new(ctx); + if (ssl == NULL) { + Serial.println("Unable to allocate SSL object"); + return; + } + + err = wolfSSL_accept(ssl); + if (err != WOLFSSL_SUCCESS) { + err = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(err, errBuf); + Serial.print("TLS Accept Error: "); + Serial.println(errBuf); + } + + Serial.print("SSL version is "); + Serial.println(wolfSSL_get_version(ssl)); + + cipherName = wolfSSL_get_cipher(ssl); + Serial.print("SSL cipher suite is "); + Serial.println(cipherName); + + Serial.print("Server Read: "); + while (client.available() || wolfSSL_pending(ssl)) { + input = wolfSSL_read(ssl, reply, sizeof(reply) - 1); + if (input < 0) { + err = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(err, errBuf); + Serial.print("TLS Read Error: "); + Serial.println(errBuf); + break; + } else if (input > 0) { + replySz = input; + reply[input] = '\0'; + Serial.print(reply); + } else { + Serial.println(); + } + } + + // echo data + if ((wolfSSL_write(ssl, reply, replySz)) != replySz) { + err = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(err, errBuf); + Serial.print("TLS Write Error: "); + Serial.println(errBuf); + } + + wolfSSL_shutdown(ssl); + wolfSSL_free(ssl); + } + + client.stop(); + Serial.println("Connection complete"); +}