diff --git a/libraries/WiFiClientSecure/src/WiFiClientSecure.cpp b/libraries/WiFiClientSecure/src/WiFiClientSecure.cpp index 23bf106806234519c747ed38f9bb639191cfbc55..40054f1c1e1dc2bb355198628cf47f59a1f2a7c4 100644 --- a/libraries/WiFiClientSecure/src/WiFiClientSecure.cpp +++ b/libraries/WiFiClientSecure/src/WiFiClientSecure.cpp @@ -230,6 +230,51 @@ bool WiFiClientSecure::verify(const char* fp, const char* domain_name) return verify_ssl_fingerprint(sslclient, fp, domain_name); } +char *WiFiClientSecure::_streamLoad(Stream& stream, size_t size) { + char *dest = (char*)malloc(size); + if (!dest) { + return nullptr; + } + if (size != stream.readBytes(dest, size)) { + free(dest); + return nullptr; + } + char ret[size+1]; + snprintf(ret, size, "%s", dest); + free(dest); + return ret; +} + +bool WiFiClientSecure::loadCACert(Stream& stream, size_t size) { + char *dest = _streamLoad(stream, size); + bool ret = false; + if (dest) { + setCACert(dest); + ret = true; + } + return ret; +} + +bool WiFiClientSecure::loadCertificate(Stream& stream, size_t size) { + char *dest = _streamLoad(stream, size); + bool ret = false; + if (dest) { + setCertificate(dest); + ret = true; + } + return ret; +} + +bool WiFiClientSecure::loadPrivateKey(Stream& stream, size_t size) { + char *dest = _streamLoad(stream, size); + bool ret = false; + if (dest) { + setPrivateKey(dest); + ret = true; + } + return ret; +} + int WiFiClientSecure::lastError(char *buf, const size_t size) { if (!_lastError) { diff --git a/libraries/WiFiClientSecure/src/WiFiClientSecure.h b/libraries/WiFiClientSecure/src/WiFiClientSecure.h index 60f24e79b815ac320751720d3f0e51d2b49d913a..21d9152fc3aafaa476a7e707b925ca23df7e4d61 100644 --- a/libraries/WiFiClientSecure/src/WiFiClientSecure.h +++ b/libraries/WiFiClientSecure/src/WiFiClientSecure.h @@ -58,6 +58,9 @@ public: void setCACert(const char *rootCA); void setCertificate(const char *client_ca); void setPrivateKey (const char *private_key); + bool loadCACert(Stream& stream, size_t size); + bool loadCertificate(Stream& stream, size_t size); + bool loadPrivateKey(Stream& stream, size_t size); bool verify(const char* fingerprint, const char* domain_name); operator bool() @@ -84,6 +87,9 @@ public: return sslclient->socket = -1; } +private: + char *_streamLoad(Stream& stream, size_t size); + //friend class WiFiServer; using Print::write; };