From c4ac183343b8af01fecfac42bcb1e2ece76d30a5 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Tue, 20 Oct 2020 16:38:28 +0200 Subject: [PATCH 1/2] Introduce WiFiBearSSLClient (offloaded to Nina) --- src/WiFiClient.cpp | 58 ++++++++++++++++++++++++++++++++++++++++ src/WiFiClient.h | 2 ++ src/WiFiSSLClient.cpp | 20 ++++++++++++++ src/WiFiSSLClient.h | 10 +++++++ src/utility/server_drv.h | 2 +- 5 files changed, 91 insertions(+), 1 deletion(-) diff --git a/src/WiFiClient.cpp b/src/WiFiClient.cpp index 778b6f5b..bfc21ec7 100644 --- a/src/WiFiClient.cpp +++ b/src/WiFiClient.cpp @@ -136,6 +136,64 @@ int WiFiClient::connectSSL(const char *host, uint16_t port) return 1; } +int WiFiClient::connectBearSSL(IPAddress ip, uint16_t port) +{ + if (_sock != NO_SOCKET_AVAIL) + { + stop(); + } + + _sock = ServerDrv::getSocket(); + if (_sock != NO_SOCKET_AVAIL) + { + ServerDrv::startClient(uint32_t(ip), port, _sock, TLS_BEARSSL_MODE); + + unsigned long start = millis(); + + // wait 4 second for the connection to close + while (!connected() && millis() - start < 10000) + delay(1); + + if (!connected()) + { + return 0; + } + } else { + Serial.println("No Socket available"); + return 0; + } + return 1; +} + +int WiFiClient::connectBearSSL(const char *host, uint16_t port) +{ + if (_sock != NO_SOCKET_AVAIL) + { + stop(); + } + + _sock = ServerDrv::getSocket(); + if (_sock != NO_SOCKET_AVAIL) + { + ServerDrv::startClient(host, strlen(host), uint32_t(0), port, _sock, TLS_BEARSSL_MODE); + + unsigned long start = millis(); + + // wait 4 second for the connection to close + while (!connected() && millis() - start < 10000) + delay(1); + + if (!connected()) + { + return 0; + } + } else { + Serial.println("No Socket available"); + return 0; + } + return 1; +} + size_t WiFiClient::write(uint8_t b) { return write(&b, 1); } diff --git a/src/WiFiClient.h b/src/WiFiClient.h index 3a5a2f14..8fcb47a4 100644 --- a/src/WiFiClient.h +++ b/src/WiFiClient.h @@ -36,6 +36,8 @@ class WiFiClient : public Client { virtual int connect(const char *host, uint16_t port); virtual int connectSSL(IPAddress ip, uint16_t port); virtual int connectSSL(const char *host, uint16_t port); + virtual int connectBearSSL(IPAddress ip, uint16_t port); + virtual int connectBearSSL(const char *host, uint16_t port); virtual size_t write(uint8_t); virtual size_t write(const uint8_t *buf, size_t size); virtual int available(); diff --git a/src/WiFiSSLClient.cpp b/src/WiFiSSLClient.cpp index 77be6627..d9eb6f1f 100644 --- a/src/WiFiSSLClient.cpp +++ b/src/WiFiSSLClient.cpp @@ -38,3 +38,23 @@ int WiFiSSLClient::connect(const char* host, uint16_t port) { return WiFiClient::connectSSL(host, port); } + +WiFiBearSSLClient::WiFiBearSSLClient() : + WiFiClient() +{ +} + +WiFiBearSSLClient::WiFiBearSSLClient(uint8_t sock) : + WiFiClient() +{ +} + +int WiFiBearSSLClient::connect(IPAddress ip, uint16_t port) +{ + return WiFiClient::connectBearSSL(ip, port); +} + +int WiFiBearSSLClient::connect(const char* host, uint16_t port) +{ + return WiFiClient::connectBearSSL(host, port); +} diff --git a/src/WiFiSSLClient.h b/src/WiFiSSLClient.h index aa13c9b5..41c3a6a0 100644 --- a/src/WiFiSSLClient.h +++ b/src/WiFiSSLClient.h @@ -32,4 +32,14 @@ class WiFiSSLClient : public WiFiClient { virtual int connect(const char* host, uint16_t port); }; +class WiFiBearSSLClient : public WiFiClient { + +public: + WiFiBearSSLClient(); + WiFiBearSSLClient(uint8_t sock); + + virtual int connect(IPAddress ip, uint16_t port); + virtual int connect(const char* host, uint16_t port); +}; + #endif /* WIFISSLCLIENT_H */ diff --git a/src/utility/server_drv.h b/src/utility/server_drv.h index f6c12ede..3cac5d35 100644 --- a/src/utility/server_drv.h +++ b/src/utility/server_drv.h @@ -24,7 +24,7 @@ #include #include "utility/wifi_spi.h" -typedef enum eProtMode {TCP_MODE, UDP_MODE, TLS_MODE, UDP_MULTICAST_MODE}tProtMode; +typedef enum eProtMode {TCP_MODE, UDP_MODE, TLS_MODE, UDP_MULTICAST_MODE, TLS_BEARSSL_MODE}tProtMode; class ServerDrv { From 5f745c6dc83ae1fa4eb82e8c4721b407de5d5818 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 18 Nov 2020 12:58:09 +0100 Subject: [PATCH 2/2] Bugfix: Passing parameter 'sock' to base class ctor --- src/WiFiSSLClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WiFiSSLClient.cpp b/src/WiFiSSLClient.cpp index d9eb6f1f..f0511447 100644 --- a/src/WiFiSSLClient.cpp +++ b/src/WiFiSSLClient.cpp @@ -45,7 +45,7 @@ WiFiBearSSLClient::WiFiBearSSLClient() : } WiFiBearSSLClient::WiFiBearSSLClient(uint8_t sock) : - WiFiClient() + WiFiClient(sock) { }