Skip to content

Commit 77bd71e

Browse files
Add Stream loaders for BearSSL (#7675)
Fixes #7671 Allows for code to do things like read certs from LittleFS or even HTTP connections with code like: File cert = LittleFS.open("/client-crt.pem", "r"); clientCert = new X509List(cert, cert.size()); cert.close();
1 parent cfdcff1 commit 77bd71e

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

libraries/ESP8266WiFi/src/BearSSLHelpers.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,17 @@ namespace brssl {
626626
return pk;
627627
}
628628

629+
static uint8_t *loadStream(Stream& stream, size_t size) {
630+
uint8_t *dest = (uint8_t *)malloc(size);
631+
if (!dest) {
632+
return nullptr; // OOM error
633+
}
634+
if (size != stream.readBytes(dest, size)) {
635+
free(dest); // Error during read
636+
return nullptr;
637+
}
638+
return dest;
639+
}
629640
};
630641

631642

@@ -648,6 +659,15 @@ PublicKey::PublicKey(const uint8_t *derKey, size_t derLen) {
648659
parse(derKey, derLen);
649660
}
650661

662+
PublicKey::PublicKey(Stream &stream, size_t size) {
663+
_key = nullptr;
664+
auto buff = brssl::loadStream(stream, size);
665+
if (buff) {
666+
parse(buff, size);
667+
free(buff);
668+
}
669+
}
670+
651671
PublicKey::~PublicKey() {
652672
if (_key) {
653673
brssl::free_public_key(_key);
@@ -711,6 +731,15 @@ PrivateKey::PrivateKey(const uint8_t *derKey, size_t derLen) {
711731
parse(derKey, derLen);
712732
}
713733

734+
PrivateKey::PrivateKey(Stream &stream, size_t size) {
735+
_key = nullptr;
736+
auto buff = brssl::loadStream(stream, size);
737+
if (buff) {
738+
parse(buff, size);
739+
free(buff);
740+
}
741+
}
742+
714743
PrivateKey::~PrivateKey() {
715744
if (_key) {
716745
brssl::free_private_key(_key);
@@ -781,6 +810,17 @@ X509List::X509List(const uint8_t *derCert, size_t derLen) {
781810
append(derCert, derLen);
782811
}
783812

813+
X509List::X509List(Stream &stream, size_t size) {
814+
_count = 0;
815+
_cert = nullptr;
816+
_ta = nullptr;
817+
auto buff = brssl::loadStream(stream, size);
818+
if (buff) {
819+
append(buff, size);
820+
free(buff);
821+
}
822+
}
823+
784824
X509List::~X509List() {
785825
brssl::free_certificates(_cert, _count); // also frees cert
786826
for (size_t i = 0; i < _count; i++) {

libraries/ESP8266WiFi/src/BearSSLHelpers.h

+6
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class PublicKey {
4343
PublicKey();
4444
PublicKey(const char *pemKey);
4545
PublicKey(const uint8_t *derKey, size_t derLen);
46+
PublicKey(Stream& stream, size_t size);
47+
PublicKey(Stream& stream) : PublicKey(stream, stream.available()) { };
4648
~PublicKey();
4749

4850
bool parse(const char *pemKey);
@@ -69,6 +71,8 @@ class PrivateKey {
6971
PrivateKey();
7072
PrivateKey(const char *pemKey);
7173
PrivateKey(const uint8_t *derKey, size_t derLen);
74+
PrivateKey(Stream& stream, size_t size);
75+
PrivateKey(Stream& stream) : PrivateKey(stream, stream.available()) { };
7276
~PrivateKey();
7377

7478
bool parse(const char *pemKey);
@@ -98,6 +102,8 @@ class X509List {
98102
X509List();
99103
X509List(const char *pemCert);
100104
X509List(const uint8_t *derCert, size_t derLen);
105+
X509List(Stream& stream, size_t size);
106+
X509List(Stream& stream) : X509List(stream, stream.available()) { };
101107
~X509List();
102108

103109
bool append(const char *pemCert);

0 commit comments

Comments
 (0)