Add MD5 computation to Esp and add request header with MD5 hash of the running sketch to HTTPUpdate (#2176)
This commit is contained in:
parent
70f000da71
commit
1289f4be4b
@ -30,6 +30,7 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#include <esp_image_format.h>
|
#include <esp_image_format.h>
|
||||||
}
|
}
|
||||||
|
#include <MD5Builder.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User-defined Literals
|
* User-defined Literals
|
||||||
@ -168,6 +169,46 @@ uint32_t EspClass::getSketchSize () {
|
|||||||
return sketchSize(SKETCH_SIZE_TOTAL);
|
return sketchSize(SKETCH_SIZE_TOTAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String EspClass::getSketchMD5()
|
||||||
|
{
|
||||||
|
static String result;
|
||||||
|
if (result.length()) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
uint32_t lengthLeft = getSketchSize();
|
||||||
|
|
||||||
|
const esp_partition_t *running = esp_ota_get_running_partition();
|
||||||
|
if (!running) {
|
||||||
|
log_e("Partition could not be found");
|
||||||
|
|
||||||
|
return String();
|
||||||
|
}
|
||||||
|
const size_t bufSize = SPI_FLASH_SEC_SIZE;
|
||||||
|
std::unique_ptr<uint8_t[]> buf(new uint8_t[bufSize]);
|
||||||
|
uint32_t offset = 0;
|
||||||
|
if(!buf.get()) {
|
||||||
|
log_e("Not enough memory to allocate buffer");
|
||||||
|
|
||||||
|
return String();
|
||||||
|
}
|
||||||
|
MD5Builder md5;
|
||||||
|
md5.begin();
|
||||||
|
while( lengthLeft > 0) {
|
||||||
|
size_t readBytes = (lengthLeft < bufSize) ? lengthLeft : bufSize;
|
||||||
|
if (!ESP.flashRead(running->address + offset, reinterpret_cast<uint32_t*>(buf.get()), (readBytes + 3) & ~3)) {
|
||||||
|
log_e("Could not read buffer from flash");
|
||||||
|
|
||||||
|
return String();
|
||||||
|
}
|
||||||
|
md5.add(buf.get(), readBytes);
|
||||||
|
lengthLeft -= readBytes;
|
||||||
|
offset += readBytes;
|
||||||
|
}
|
||||||
|
md5.calculate();
|
||||||
|
result = md5.toString();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t EspClass::getFreeSketchSpace () {
|
uint32_t EspClass::getFreeSketchSpace () {
|
||||||
const esp_partition_t* _partition = esp_ota_get_next_update_partition(NULL);
|
const esp_partition_t* _partition = esp_ota_get_next_update_partition(NULL);
|
||||||
if(!_partition){
|
if(!_partition){
|
||||||
|
@ -90,6 +90,7 @@ public:
|
|||||||
FlashMode_t magicFlashChipMode(uint8_t byte);
|
FlashMode_t magicFlashChipMode(uint8_t byte);
|
||||||
|
|
||||||
uint32_t getSketchSize();
|
uint32_t getSketchSize();
|
||||||
|
String getSketchMD5();
|
||||||
uint32_t getFreeSketchSpace();
|
uint32_t getFreeSketchSpace();
|
||||||
|
|
||||||
bool flashEraseSector(uint32_t sector);
|
bool flashEraseSector(uint32_t sector);
|
||||||
|
@ -181,8 +181,11 @@ HTTPUpdateResult HTTPUpdate::handleUpdate(HTTPClient& http, const String& curren
|
|||||||
http.addHeader("x-ESP32-AP-MAC", WiFi.softAPmacAddress());
|
http.addHeader("x-ESP32-AP-MAC", WiFi.softAPmacAddress());
|
||||||
http.addHeader("x-ESP32-free-space", String(ESP.getFreeSketchSpace()));
|
http.addHeader("x-ESP32-free-space", String(ESP.getFreeSketchSpace()));
|
||||||
http.addHeader("x-ESP32-sketch-size", String(ESP.getSketchSize()));
|
http.addHeader("x-ESP32-sketch-size", String(ESP.getSketchSize()));
|
||||||
// To do http.addHeader("x-ESP32-sketch-md5", String(ESP.getSketchMD5()));
|
String sketchMD5 = ESP.getSketchMD5();
|
||||||
// Sketch MD5 is not supported by the core, but SHA256 is, so add a SHA256 instead
|
if(sketchMD5.length() != 0) {
|
||||||
|
http.addHeader("x-ESP32-sketch-md5", sketchMD5);
|
||||||
|
}
|
||||||
|
// Add also a SHA256
|
||||||
String sketchSHA256 = getSketchSHA256();
|
String sketchSHA256 = getSketchSHA256();
|
||||||
if(sketchSHA256.length() != 0) {
|
if(sketchSHA256.length() != 0) {
|
||||||
http.addHeader("x-ESP32-sketch-sha256", sketchSHA256);
|
http.addHeader("x-ESP32-sketch-sha256", sketchSHA256);
|
||||||
|
Loading…
Reference in New Issue
Block a user