No support for reading client certificate and private key from LittleFS (ESP8266WiFi - WiFiClientSecure/BearSSL) (original) (raw)

Basic Infos

Platform

Problem Description

Currently, when using WiFiClientSecure (BearSSL), certificate stores can be loaded from LittleFS or SD.
But there is no documented way or code to load a client certificate and private key in a similar manner.
(The X509List and PrivateKey do not take files/streams as arguments)

Old issues and examples show that older versions used to have this feature:

Specifically it seems like the old functions loadCertificate() and loadPrivateKey() (which are deprecated) could load files.

My current solution is to copy the certificate and key to a global variable, which wastes several KB's RAM:

#include <Arduino.h> #include <ESP8266WiFi.h> #include <LittleFS.h> #include <WiFiClientSecure.h>

#define MAX_PEM_SIZE 4096

char clientKeyStr[MAX_PEM_SIZE]; char clientCertStr[MAX_PEM_SIZE];

void setup() { LittleFS.begin(); Serial.begin(115200);

//... initialize wifi and time...

File cert = LittleFS.open("/client-crt.pem", "r"); //can be .der file as well File key = LittleFS.open("/client-key.pem", "r");

//... verify files are opened correctly and not exceed MAX_PEM_SIZE ...

cert.readBytes(clientCertStr, cert.size()); //copy certificate from file to char array key.readBytes(clientKeyStr, key.size()); //same for private key X509List clientCert(clientCertStr); PrivateKey clientKey(clientKeyStr);

//...connect to server... }

This sketch works well but wastes 4096*2 = 8192 bytes of RAM which is 10% of total RAM.
My assumption is, when using CertStoreBearSSL.h, the certificates are not copied to the RAM for most of the time, but loaded in a different way.
Same thing goes when loading a certificate which is saved in PROGMEM (sketch ROM).
Therefore, it should be possible to use a client certificates and a private key which are stored as .pem or .der in the file system, without copying the whole file content to the RAM, for the whole lifetime of the program.
I tried understanding the code in CertStoreBearSSL.cpp but it's too complicated for me.
Thanks in advance and Best regards!