Implement a comprehensive solution for validating a firmware before an OTA updated is committed. WLED metadata such as version and release is moved to a data structure located at near the start of the firmware binary, where it can be identified and validated. Co-authored-by: netmindz <442066+netmindz@users.noreply.github.com>
72 lines
2.5 KiB
C++
72 lines
2.5 KiB
C++
/*
|
|
WLED build metadata
|
|
|
|
Manages and exports information about the current WLED build.
|
|
*/
|
|
|
|
|
|
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <string.h>
|
|
#include <WString.h>
|
|
|
|
#ifndef WLED_VERSION
|
|
#define WLED_VERSION dev
|
|
#endif
|
|
#ifndef WLED_RELEASE_NAME
|
|
#define WLED_RELEASE_NAME "Custom"
|
|
#endif
|
|
#ifndef WLED_REPO
|
|
#define WLED_REPO "unknown"
|
|
#endif
|
|
|
|
#define WLED_VERSION_MAX_LEN 48
|
|
#define WLED_RELEASE_NAME_MAX_LEN 48
|
|
|
|
/**
|
|
* WLED Custom Description Structure
|
|
* This structure is embedded in platform-specific sections at an approximately
|
|
* fixed offset in ESP32/ESP8266 binaries, where it can be found and validated
|
|
* by the OTA process.
|
|
*/
|
|
typedef struct {
|
|
uint32_t magic; // Magic number to identify WLED custom description
|
|
uint32_t desc_version; // Structure version for future compatibility
|
|
char wled_version[WLED_VERSION_MAX_LEN];
|
|
char release_name[WLED_RELEASE_NAME_MAX_LEN]; // Release name (null-terminated)
|
|
uint32_t hash; // Structure sanity check
|
|
} __attribute__((packed)) wled_custom_desc_t;
|
|
|
|
|
|
// Global build description
|
|
extern const wled_custom_desc_t WLED_BUILD_DESCRIPTION;
|
|
|
|
// Convenient metdata pointers
|
|
#define versionString (WLED_BUILD_DESCRIPTION.wled_version) // Build version, WLED_VERSION
|
|
#define releaseString (WLED_BUILD_DESCRIPTION.release_name) // Release name, WLED_RELEASE_NAME
|
|
extern const __FlashStringHelper* repoString; // Github repository (if available)
|
|
extern const __FlashStringHelper* productString; // Product, WLED_PRODUCT_NAME -- deprecated, use WLED_RELEASE_NAME
|
|
extern const __FlashStringHelper* brandString ; // Brand
|
|
|
|
|
|
// Metadata analysis functions
|
|
|
|
/**
|
|
* Extract WLED custom description structure from binary data
|
|
* @param binaryData Pointer to binary file data
|
|
* @param dataSize Size of binary data in bytes
|
|
* @param extractedDesc Buffer to store extracted custom description structure
|
|
* @return true if structure was found and extracted, false otherwise
|
|
*/
|
|
bool findWledMetadata(const uint8_t* binaryData, size_t dataSize, wled_custom_desc_t* extractedDesc);
|
|
|
|
/**
|
|
* Check if OTA should be allowed based on release compatibility
|
|
* @param firmwareDescription Pointer to firmware description
|
|
* @param errorMessage Buffer to store error message if validation fails
|
|
* @param errorMessageLen Maximum length of error message buffer
|
|
* @return true if OTA should proceed, false if it should be blocked
|
|
*/
|
|
bool shouldAllowOTA(const wled_custom_desc_t& firmwareDescription, char* errorMessage, size_t errorMessageLen);
|