Skip to content

Commit 84b046f

Browse files
committed
WiFiClientSecure: add support for keys and certificates in PROGMEM
1 parent f85f826 commit 84b046f

File tree

4 files changed

+42
-3
lines changed

4 files changed

+42
-3
lines changed

libraries/ESP8266WiFi/examples/HTTPSRequestCACert/CACert.ino

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
const unsigned char caCert[] = {
2+
const unsigned char caCert[] PROGMEM = {
33
0x30, 0x82, 0x03, 0xc5, 0x30, 0x82, 0x02, 0xad, 0xa0, 0x03, 0x02, 0x01,
44
0x02, 0x02, 0x10, 0x02, 0xac, 0x5c, 0x26, 0x6a, 0x0b, 0x40, 0x9b, 0x8f,
55
0x0b, 0x79, 0xf2, 0xae, 0x46, 0x25, 0x77, 0x30, 0x0d, 0x06, 0x09, 0x2a,

libraries/ESP8266WiFi/examples/HTTPSRequestCACert/HTTPSRequestCACert.ino

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const int httpsPort = 443;
2727

2828
// Root certificate used by api.github.com.
2929
// Defined in "CACert" tab.
30-
extern const unsigned char caCert[];
30+
extern const unsigned char caCert[] PROGMEM;
3131
extern const unsigned int caCertLen;
3232

3333
WiFiClientSecure client;
@@ -64,7 +64,7 @@ void setup() {
6464
Serial.print(asctime(&timeinfo));
6565

6666
// Load root certificate in DER format into WiFiClientSecure object
67-
bool res = client.setCACert(caCert, caCertLen);
67+
bool res = client.setCACert_P(caCert, caCertLen);
6868
if (!res) {
6969
Serial.println("Failed to load root CA certificate!");
7070
while (true) {

libraries/ESP8266WiFi/src/WiFiClientSecure.cpp

+35
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,14 @@ class SSLContext
209209
return loadObject(type, buf.get(), size);
210210
}
211211

212+
bool loadObject_P(int type, PGM_VOID_P data, size_t size)
213+
{
214+
std::unique_ptr<uint8_t[]> buf(new uint8_t[size]);
215+
memcpy_P(buf.get(),data, size);
216+
return loadObject(type, buf.get(), size);
217+
}
218+
219+
212220
bool loadObject(int type, const uint8_t* data, size_t size)
213221
{
214222
int rc = ssl_obj_memory_load(_ssl_ctx, type, data, static_cast<int>(size), nullptr);
@@ -587,6 +595,33 @@ bool WiFiClientSecure::setPrivateKey(const uint8_t* pk, size_t size)
587595
return _ssl->loadObject(SSL_OBJ_RSA_KEY, pk, size);
588596
}
589597

598+
bool WiFiClientSecure::setCACert_P(PGM_VOID_P pk, size_t size)
599+
{
600+
if (!_ssl) {
601+
_ssl = new SSLContext;
602+
_ssl->ref();
603+
}
604+
return _ssl->loadObject_P(SSL_OBJ_X509_CACERT, pk, size);
605+
}
606+
607+
bool WiFiClientSecure::setCertificate_P(PGM_VOID_P pk, size_t size)
608+
{
609+
if (!_ssl) {
610+
_ssl = new SSLContext;
611+
_ssl->ref();
612+
}
613+
return _ssl->loadObject_P(SSL_OBJ_X509_CERT, pk, size);
614+
}
615+
616+
bool WiFiClientSecure::setPrivateKey_P(PGM_VOID_P pk, size_t size)
617+
{
618+
if (!_ssl) {
619+
_ssl = new SSLContext;
620+
_ssl->ref();
621+
}
622+
return _ssl->loadObject_P(SSL_OBJ_RSA_KEY, pk, size);
623+
}
624+
590625
bool WiFiClientSecure::loadCACert(Stream& stream, size_t size)
591626
{
592627
if (!_ssl) {

libraries/ESP8266WiFi/src/WiFiClientSecure.h

+4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ class WiFiClientSecure : public WiFiClient {
5454
bool setCertificate(const uint8_t* pk, size_t size);
5555
bool setPrivateKey(const uint8_t* pk, size_t size);
5656

57+
bool setCACert_P(PGM_VOID_P pk, size_t size);
58+
bool setCertificate_P(PGM_VOID_P pk, size_t size);
59+
bool setPrivateKey_P(PGM_VOID_P pk, size_t size);
60+
5761
bool loadCACert(Stream& stream, size_t size);
5862
bool loadCertificate(Stream& stream, size_t size);
5963
bool loadPrivateKey(Stream& stream, size_t size);

0 commit comments

Comments
 (0)