2024-05-08 23:54:17 +02:00
|
|
|
#include "shared.hpp"
|
|
|
|
|
2024-11-25 23:54:02 +01:00
|
|
|
// const char *github_root_ca =
|
|
|
|
// "-----BEGIN CERTIFICATE-----\n"
|
|
|
|
// "MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL\n"
|
|
|
|
// "MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl\n"
|
|
|
|
// "eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT\n"
|
|
|
|
// "JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx\n"
|
|
|
|
// "MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT\n"
|
|
|
|
// "Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg\n"
|
|
|
|
// "VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm\n"
|
|
|
|
// "aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo\n"
|
|
|
|
// "I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng\n"
|
|
|
|
// "o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G\n"
|
|
|
|
// "A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD\n"
|
|
|
|
// "VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB\n"
|
|
|
|
// "zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW\n"
|
|
|
|
// "RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=\n"
|
|
|
|
// "-----END CERTIFICATE-----\n"
|
|
|
|
// "-----BEGIN CERTIFICATE-----\n"
|
|
|
|
// "MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\n"
|
|
|
|
// "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
|
|
|
|
// "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
|
|
|
|
// "MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\n"
|
|
|
|
// "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
|
|
|
|
// "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\n"
|
|
|
|
// "9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI\n"
|
|
|
|
// "2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\n"
|
|
|
|
// "1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\n"
|
|
|
|
// "q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz\n"
|
|
|
|
// "tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\n"
|
|
|
|
// "vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\n"
|
|
|
|
// "BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\n"
|
|
|
|
// "5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\n"
|
|
|
|
// "1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4\n"
|
|
|
|
// "NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG\n"
|
|
|
|
// "Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\n"
|
|
|
|
// "8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe\n"
|
|
|
|
// "pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\n"
|
|
|
|
// "MrY=\n"
|
|
|
|
// "-----END CERTIFICATE-----\n";
|
|
|
|
|
|
|
|
const char* isrg_root_x1cert = R"EOF(
|
|
|
|
-----BEGIN CERTIFICATE-----
|
|
|
|
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
|
|
|
|
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
|
|
|
|
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
|
|
|
|
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
|
|
|
|
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
|
|
|
|
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
|
|
|
|
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
|
|
|
|
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
|
|
|
|
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
|
|
|
|
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
|
|
|
|
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
|
|
|
|
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
|
|
|
|
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
|
|
|
|
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
|
|
|
|
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
|
|
|
|
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
|
|
|
|
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
|
|
|
|
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
|
|
|
|
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
|
|
|
|
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
|
|
|
|
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
|
|
|
|
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
|
|
|
|
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
|
|
|
|
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
|
|
|
|
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
|
|
|
|
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
|
|
|
|
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
|
|
|
|
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
|
|
|
|
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
|
|
|
|
-----END CERTIFICATE-----
|
|
|
|
)EOF";
|
|
|
|
|
2024-09-11 03:23:41 +02:00
|
|
|
|
2024-05-08 23:54:17 +02:00
|
|
|
#ifdef TEST_SCREENS
|
2024-09-11 03:23:41 +02:00
|
|
|
uint8_t input_buffer[3 * input_buffer_pixels]; // up to depth 24
|
|
|
|
uint8_t output_row_mono_buffer[max_row_width / 8]; // buffer for at least one row of b/w bits
|
|
|
|
uint8_t output_row_color_buffer[max_row_width / 8]; // buffer for at least one row of color bits
|
|
|
|
uint8_t mono_palette_buffer[max_palette_pixels / 8]; // palette buffer for depth <= 8 b/w
|
2024-05-08 23:54:17 +02:00
|
|
|
uint8_t color_palette_buffer[max_palette_pixels / 8]; // palette buffer for depth <= 8 c/w
|
2024-09-11 03:23:41 +02:00
|
|
|
uint16_t rgb_palette_buffer[max_palette_pixels]; // palette buffer for depth <= 8 for buffered graphics, needed for 7-color display
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Function to calculate SHA-256 hash
|
|
|
|
String calculateSHA256(uint8_t *data, size_t len)
|
|
|
|
{
|
|
|
|
byte shaResult[32];
|
|
|
|
mbedtls_md_context_t ctx;
|
|
|
|
mbedtls_md_type_t md_type = MBEDTLS_MD_SHA256;
|
|
|
|
|
|
|
|
mbedtls_md_init(&ctx);
|
|
|
|
mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 0);
|
|
|
|
mbedtls_md_starts(&ctx);
|
|
|
|
mbedtls_md_update(&ctx, data, len);
|
|
|
|
mbedtls_md_finish(&ctx, shaResult);
|
|
|
|
mbedtls_md_free(&ctx);
|
|
|
|
|
|
|
|
char sha256_str[65];
|
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
|
{
|
|
|
|
sprintf(sha256_str + (i * 2), "%02x", shaResult[i]);
|
|
|
|
}
|
|
|
|
sha256_str[64] = 0;
|
|
|
|
|
|
|
|
return String(sha256_str);
|
|
|
|
}
|
2024-09-11 17:40:44 +02:00
|
|
|
|
|
|
|
String calculateSHA256(WiFiClient *stream, size_t contentLength) {
|
|
|
|
mbedtls_md_context_t ctx;
|
|
|
|
mbedtls_md_type_t md_type = MBEDTLS_MD_SHA256;
|
|
|
|
|
|
|
|
mbedtls_md_init(&ctx);
|
|
|
|
mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 0);
|
|
|
|
mbedtls_md_starts(&ctx);
|
|
|
|
|
|
|
|
uint8_t buff[1024];
|
|
|
|
size_t bytesRead = 0;
|
|
|
|
|
|
|
|
while (bytesRead < contentLength) {
|
|
|
|
size_t toRead = min((size_t)(contentLength - bytesRead), sizeof(buff));
|
|
|
|
size_t readBytes = stream->readBytes(buff, toRead);
|
|
|
|
|
|
|
|
if (readBytes == 0) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
mbedtls_md_update(&ctx, buff, readBytes);
|
|
|
|
bytesRead += readBytes;
|
|
|
|
}
|
|
|
|
|
|
|
|
byte shaResult[32];
|
|
|
|
mbedtls_md_finish(&ctx, shaResult);
|
|
|
|
mbedtls_md_free(&ctx);
|
|
|
|
|
|
|
|
String result = "";
|
|
|
|
for (int i = 0; i < sizeof(shaResult); i++) {
|
|
|
|
char str[3];
|
|
|
|
sprintf(str, "%02x", (int)shaResult[i]);
|
|
|
|
result += str;
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
2024-12-18 19:47:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// uint8_t* getOceanIcon() {
|
|
|
|
// zlib_turbo zt;
|
|
|
|
// int iUncompSize = zt.gzip_info((uint8_t *)ocean_logo_comp, ocean_logo_size);
|
|
|
|
// uint8_t *pUncompressed;
|
|
|
|
// pUncompressed = (uint8_t *)malloc(iUncompSize+4);
|
|
|
|
// zt.gunzip((uint8_t *)ocean_logo_comp, ocean_logo_size, pUncompressed);
|
2024-12-20 23:02:54 +01:00
|
|
|
// }
|
|
|
|
|
|
|
|
WiFiClientSecure HttpHelper::secureClient;
|
|
|
|
WiFiClient HttpHelper::insecureClient;
|
|
|
|
bool HttpHelper::certBundleSet = false;
|
|
|
|
|
|
|
|
HTTPClient* HttpHelper::begin(const String& url) {
|
|
|
|
HTTPClient* http = new HTTPClient();
|
|
|
|
|
|
|
|
if (url.startsWith("https://")) {
|
|
|
|
if (!certBundleSet) {
|
|
|
|
secureClient.setCACertBundle(rootca_crt_bundle_start);
|
|
|
|
certBundleSet = true;
|
|
|
|
}
|
|
|
|
http->begin(secureClient, url);
|
|
|
|
} else {
|
|
|
|
http->begin(insecureClient, url);
|
|
|
|
}
|
|
|
|
|
|
|
|
http->setUserAgent(USER_AGENT);
|
|
|
|
return http;
|
|
|
|
}
|
|
|
|
|
|
|
|
void HttpHelper::end(HTTPClient* http) {
|
|
|
|
if (http) {
|
|
|
|
http->end();
|
|
|
|
delete http;
|
|
|
|
}
|
|
|
|
}
|