7#include "../configuration/HardwareConfiguration.h"
9#include <ESP8266WiFi.h>
65 Serial.println(
"No SSL Certificates found in Flash.");
70 Serial.println(
" SSL Certificates found in Flash.");
85 display->print(
"Updating SSL Certs");
94 Serial.print(
"Free Heap: ");
95 Serial.print(ESP.getFreeHeap());
96 Serial.print(
" Free Stack: ");
97 Serial.println(ESP.getFreeContStack());
101 File certsCsv = LittleFS.open(
"/certs.csv",
"r");
102 int numberOfCertificates = 0;
108 numberOfCertificates++;
112 if (numberOfCertificates == 0) {
117 Serial.print(
"Free Heap: ");
118 Serial.print(ESP.getFreeHeap());
119 Serial.print(
" Free Stack: ");
120 Serial.println(ESP.getFreeContStack());
128 display->print(
"Updating SSL Certs");
132 display->print(
"Certificate 0/");
133 display->print(numberOfCertificates);
135 File certsAr = LittleFS.open(
"/certs.tmp",
"w");
136 certsAr.write(
"!<arch>\n");
142 display->print(numberOfCertificates);
155 Serial.print(
"Free Heap: ");
156 Serial.print(ESP.getFreeHeap());
157 Serial.print(
" Free Stack: ");
158 Serial.println(ESP.getFreeContStack());
162 display->print(
"Updating SSL Certs");
164 display->print(
"Verifying...");
166 Serial.print(
"Free Heap: ");
167 Serial.print(ESP.getFreeHeap());
168 Serial.print(
" Free Stack: ");
169 Serial.println(ESP.getFreeContStack());
172 if (LittleFS.exists(
"/certs.ar")) {
173 LittleFS.remove(
"/certs.ar");
175 if (LittleFS.exists(
"/certs.idx")) {
176 LittleFS.remove(
"/certs.idx");
178 if (LittleFS.exists(
"/certst.idx")) {
179 LittleFS.remove(
"/certst.idx");
181 LittleFS.rename(
"/certs.tmp",
"/certs.ar");
185 display->print(
"OK. Going to Reboot");
199 while (stillActive()) {
200 for (
int i = 0; (i < 20) && stillActive(); i++) {
221 lastErrorMessage =
"Connection to https://" + host +
"/" + url +
" failed.";
232 "User-Agent: ESP8266\r\n"
233 "Connection: Keep-Alive\r\n\r\n");
237 String result =
"Invalid Header received.";
239 String line =
sslClient.readStringUntil(
'\n');
241 if ((line.length() > 8) && (line.substring(0, 8) ==
"HTTP/1.1")) {
242 result = line.substring(9);
253 if (result !=
"200 OK") {
254 lastErrorMessage =
"Error Getting https://" + host +
"/" + url +
": " + result;
262 Serial.print(
"Free Heap: ");
263 Serial.print(ESP.getFreeHeap());
264 Serial.print(
" Free Stack: ");
265 Serial.println(ESP.getFreeContStack());
267 display->print(
"Connecting...");
268 if (!
initializeConnection(
"ccadb-public.secure.force.com",
"mozilla/IncludedCACertificateReportPEMCSV")) {
271 Serial.print(
"Free Heap: ");
272 Serial.print(ESP.getFreeHeap());
273 Serial.print(
" Free Stack: ");
274 Serial.println(ESP.getFreeContStack());
276 File certsCsv = LittleFS.open(
"/certs.csv",
"w");
278 int blockCounter = 0;
281 display->print(
"Downloading 0kb ");
283 size_t numBytesRead =
sslClient.readBytes(buf, 100);
284 if (numBytesRead == 0) {
287 certsCsv.write(buf, numBytesRead);
290 if (blockCounter % 100 == 0) {
292 display->print(blockCounter / 10);
299 display->print(
"CSV downloaded. ");
301 display->print(
"Saving file.");
303 Serial.print(
"Free Heap: ");
304 Serial.print(ESP.getFreeHeap());
305 Serial.print(
" Free Stack: ");
306 Serial.println(ESP.getFreeContStack());
310 Serial.print(
"Free Heap: ");
311 Serial.print(ESP.getFreeHeap());
312 Serial.print(
" Free Stack: ");
313 Serial.println(ESP.getFreeContStack());
320 const char* searchString =
"-----BEGIN CERTIFICATE-----";
321 const char* searchChar = searchString;
323 while (searchChar != searchString + strlen(searchString)) {
325 if (certsCsv.read(&chr, 1) != 1) {
329 if (chr == *searchChar) {
333 searchChar = searchString;
344 static const uint8_t base64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
349 strcpy(headerBuf,
"ca_000.der/ ");
354 certsAr.write(headerBuf, 16);
356 certsAr.write(
"1596291962 ", 12);
358 certsAr.write(
"0 ", 6);
360 certsAr.write(
"0 ", 6);
362 certsAr.write(
"100666 ", 8);
363 auto sizeStart = certsAr.position();
365 certsAr.write(
" ", 10);
369 certsAr.write(headerBuf, 2);
372 uint16_t fileSize = 0;
375 uint8_t buf[3] = {0, 0, 0};
376 uint8_t parserInCounter = 0;
377 uint8_t parserOutCounter = 0;
380 while (parserInCounter != 4) {
382 if (certsCsv.read(&chr, 1) != 1) {
399 for (i = 0; i < 64 && chr != base64[i]; i++) {
404 switch (parserInCounter) {
407 parserOutCounter = 1;
413 parserOutCounter = 2;
419 parserOutCounter = 2;
421 parserOutCounter = 3;
426 parserOutCounter = 3;
434 certsAr.write(buf, parserOutCounter);
435 fileSize += parserOutCounter;
444 if (fileSize % 2 != 0) {
446 certsAr.write(headerBuf, 1);
450 certsAr.seek(sizeStart);
451 certsAr.print(fileSize);
452 certsAr.seek(0, fs::SeekEnd);
463 virtual void tick(
const bool& forceRedraw) {}
View displayed while updating the certificates.
Definition: UpdateCertificatesView.h:17
virtual void activate()
called as soon as the view becomes active
Definition: UpdateCertificatesView.h:81
BearSSL::CertStore certStore
Reference of the certificate store.
Definition: UpdateCertificatesView.h:28
bool goToStartOfNextCertificate(File &certsCsv)
Definition: UpdateCertificatesView.h:319
UpdateCertificatesView(LiquidCrystal_PCF8574 *display, WiFiClientSecure &sslClient, BearSSL::CertStore &certStore)
Construct a vie object.
Definition: UpdateCertificatesView.h:43
int numberOfLoadedCertificates
Definition: UpdateCertificatesView.h:33
WiFiClientSecure & sslClient
Reference of the ssl client used for the communication.
Definition: UpdateCertificatesView.h:22
UpdateCertificatesView(const UpdateCertificatesView &other)=delete
Copy constructor - not available.
bool downloadCertificatesAsCsv()
Definition: UpdateCertificatesView.h:261
bool convertCertificate(File &certsCsv, File &certsAr)
Definition: UpdateCertificatesView.h:343
uint16_t certificateCounter
Definition: UpdateCertificatesView.h:341
virtual void tick(const bool &forceRedraw)
called during the loop function
Definition: UpdateCertificatesView.h:463
UpdateCertificatesView(UpdateCertificatesView &&other) noexcept=delete
Move constructor - not available.
String lastErrorMessage
Definition: UpdateCertificatesView.h:30
void waitAnimation(std::function< bool()> stillActive)
Shows the animation while waiting until the callback returns false.
Definition: UpdateCertificatesView.h:198
bool initializeConnection(const String &host, const String &url)
Definition: UpdateCertificatesView.h:218
int begin()
Definition: UpdateCertificatesView.h:61
views::ConfigurationServerView configurationServerView & display
Definition: main.cpp:57
Definition: ConfigurationServerView.h:10