Merge branch 'feature/verify_chip_revision_during_ota' into 'master'

feat(esp_https_ota): added check for revision check while performing OTA

See merge request espressif/esp-idf!37270
This commit is contained in:
Mahavir Jain
2025-03-05 22:29:35 +08:00
5 changed files with 33 additions and 0 deletions

View File

@@ -29,6 +29,7 @@ typedef enum {
ESP_HTTPS_OTA_CONNECTED, /*!< Connected to server */ ESP_HTTPS_OTA_CONNECTED, /*!< Connected to server */
ESP_HTTPS_OTA_GET_IMG_DESC, /*!< Read app/bootloader description from image header */ ESP_HTTPS_OTA_GET_IMG_DESC, /*!< Read app/bootloader description from image header */
ESP_HTTPS_OTA_VERIFY_CHIP_ID, /*!< Verify chip id of new image */ ESP_HTTPS_OTA_VERIFY_CHIP_ID, /*!< Verify chip id of new image */
ESP_HTTPS_OTA_VERIFY_CHIP_REVISION, /*!< Verify chip revision of new image */
ESP_HTTPS_OTA_DECRYPT_CB, /*!< Callback to decrypt function */ ESP_HTTPS_OTA_DECRYPT_CB, /*!< Callback to decrypt function */
ESP_HTTPS_OTA_WRITE_FLASH, /*!< Flash write operation */ ESP_HTTPS_OTA_WRITE_FLASH, /*!< Flash write operation */
ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION, /*!< Boot partition update after successful ota update */ ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION, /*!< Boot partition update after successful ota update */

View File

@@ -14,6 +14,7 @@
#include <sys/param.h> #include <sys/param.h>
#include <inttypes.h> #include <inttypes.h>
#include "esp_check.h" #include "esp_check.h"
#include "hal/efuse_hal.h"
ESP_EVENT_DEFINE_BASE(ESP_HTTPS_OTA_EVENT); ESP_EVENT_DEFINE_BASE(ESP_HTTPS_OTA_EVENT);
@@ -203,6 +204,7 @@ static const char* ota_event_name_table[] = {
"ESP_HTTPS_OTA_CONNECTED", "ESP_HTTPS_OTA_CONNECTED",
"ESP_HTTPS_OTA_GET_IMG_DESC", "ESP_HTTPS_OTA_GET_IMG_DESC",
"ESP_HTTPS_OTA_VERIFY_CHIP_ID", "ESP_HTTPS_OTA_VERIFY_CHIP_ID",
"ESP_HTTPS_OTA_VERIFY_CHIP_REVISION",
"ESP_HTTPS_OTA_DECRYPT_CB", "ESP_HTTPS_OTA_DECRYPT_CB",
"ESP_HTTPS_OTA_WRITE_FLASH", "ESP_HTTPS_OTA_WRITE_FLASH",
"ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION", "ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION",
@@ -624,6 +626,20 @@ static esp_err_t esp_ota_verify_chip_id(const void *arg)
return ESP_OK; return ESP_OK;
} }
static esp_err_t esp_ota_verify_chip_revision(const void *arg)
{
esp_image_header_t *data = (esp_image_header_t *)(arg);
esp_https_ota_dispatch_event(ESP_HTTPS_OTA_VERIFY_CHIP_REVISION, (void *)(&data->min_chip_rev_full), sizeof(uint16_t));
uint16_t ota_img_revision = data->min_chip_rev_full;
uint32_t chip_revision = efuse_hal_chip_revision();
if (ota_img_revision > chip_revision) {
ESP_LOGE(TAG, "Image requires chip rev >= v%d.%d, but chip is v%d.%d", ota_img_revision / 100, ota_img_revision % 100, chip_revision / 100, chip_revision % 100);
return ESP_ERR_INVALID_VERSION;
}
return ESP_OK;
}
esp_err_t esp_https_ota_perform(esp_https_ota_handle_t https_ota_handle) esp_err_t esp_https_ota_perform(esp_https_ota_handle_t https_ota_handle)
{ {
esp_https_ota_t *handle = (esp_https_ota_t *)https_ota_handle; esp_https_ota_t *handle = (esp_https_ota_t *)https_ota_handle;
@@ -685,6 +701,11 @@ esp_err_t esp_https_ota_perform(esp_https_ota_handle_t https_ota_handle)
if (err != ESP_OK) { if (err != ESP_OK) {
return err; return err;
} }
err = esp_ota_verify_chip_revision(data_buf);
if (err != ESP_OK) {
return err;
}
} }
return _ota_write(handle, data_buf, binary_file_len); return _ota_write(handle, data_buf, binary_file_len);
case ESP_HTTPS_OTA_RESUME: case ESP_HTTPS_OTA_RESUME:

View File

@@ -121,6 +121,9 @@ Event Handler Example
case ESP_HTTPS_OTA_VERIFY_CHIP_ID: case ESP_HTTPS_OTA_VERIFY_CHIP_ID:
ESP_LOGI(TAG, "Verifying chip id of new image: %d", *(esp_chip_id_t *)event_data); ESP_LOGI(TAG, "Verifying chip id of new image: %d", *(esp_chip_id_t *)event_data);
break; break;
case ESP_HTTPS_OTA_VERIFY_CHIP_REVISION:
ESP_LOGI(TAG, "Verifying chip revision of new image: %d", *(uint16_t *)event_data);
break;
case ESP_HTTPS_OTA_DECRYPT_CB: case ESP_HTTPS_OTA_DECRYPT_CB:
ESP_LOGI(TAG, "Callback to decrypt function"); ESP_LOGI(TAG, "Callback to decrypt function");
break; break;
@@ -146,6 +149,7 @@ Expected data type for different ESP HTTPS OTA events in the system event loop:
- ESP_HTTPS_OTA_CONNECTED : ``NULL`` - ESP_HTTPS_OTA_CONNECTED : ``NULL``
- ESP_HTTPS_OTA_GET_IMG_DESC : ``NULL`` - ESP_HTTPS_OTA_GET_IMG_DESC : ``NULL``
- ESP_HTTPS_OTA_VERIFY_CHIP_ID : ``esp_chip_id_t`` - ESP_HTTPS_OTA_VERIFY_CHIP_ID : ``esp_chip_id_t``
- ESP_HTTPS_OTA_VERIFY_CHIP_REVISION : ``uint16_t``
- ESP_HTTPS_OTA_DECRYPT_CB : ``NULL`` - ESP_HTTPS_OTA_DECRYPT_CB : ``NULL``
- ESP_HTTPS_OTA_WRITE_FLASH : ``int`` - ESP_HTTPS_OTA_WRITE_FLASH : ``int``
- ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION : ``esp_partition_subtype_t`` - ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION : ``esp_partition_subtype_t``

View File

@@ -121,6 +121,9 @@ ESP HTTPS OTA 过程中可能发生各种系统事件。当特定事件发生时
case ESP_HTTPS_OTA_VERIFY_CHIP_ID: case ESP_HTTPS_OTA_VERIFY_CHIP_ID:
ESP_LOGI(TAG, "Verifying chip id of new image: %d", *(esp_chip_id_t *)event_data); ESP_LOGI(TAG, "Verifying chip id of new image: %d", *(esp_chip_id_t *)event_data);
break; break;
case ESP_HTTPS_OTA_VERIFY_CHIP_REVISION:
ESP_LOGI(TAG, "Verifying chip revision of new image: %d", *(uint16_t *)event_data);
break;
case ESP_HTTPS_OTA_DECRYPT_CB: case ESP_HTTPS_OTA_DECRYPT_CB:
ESP_LOGI(TAG, "Callback to decrypt function"); ESP_LOGI(TAG, "Callback to decrypt function");
break; break;
@@ -146,6 +149,7 @@ ESP HTTPS OTA 过程中可能发生各种系统事件。当特定事件发生时
- ESP_HTTPS_OTA_CONNECTED : ``NULL`` - ESP_HTTPS_OTA_CONNECTED : ``NULL``
- ESP_HTTPS_OTA_GET_IMG_DESC : ``NULL`` - ESP_HTTPS_OTA_GET_IMG_DESC : ``NULL``
- ESP_HTTPS_OTA_VERIFY_CHIP_ID : ``esp_chip_id_t`` - ESP_HTTPS_OTA_VERIFY_CHIP_ID : ``esp_chip_id_t``
- ESP_HTTPS_OTA_VERIFY_CHIP_REVISION : ``uint16_t``
- ESP_HTTPS_OTA_DECRYPT_CB : ``NULL`` - ESP_HTTPS_OTA_DECRYPT_CB : ``NULL``
- ESP_HTTPS_OTA_WRITE_FLASH : ``int`` - ESP_HTTPS_OTA_WRITE_FLASH : ``int``
- ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION : ``esp_partition_subtype_t`` - ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION : ``esp_partition_subtype_t``

View File

@@ -148,6 +148,9 @@ static void event_handler(void* arg, esp_event_base_t event_base,
case ESP_HTTPS_OTA_VERIFY_CHIP_ID: case ESP_HTTPS_OTA_VERIFY_CHIP_ID:
ESP_LOGI(TAG, "Verifying chip id of new image: %d", *(esp_chip_id_t *)event_data); ESP_LOGI(TAG, "Verifying chip id of new image: %d", *(esp_chip_id_t *)event_data);
break; break;
case ESP_HTTPS_OTA_VERIFY_CHIP_REVISION:
ESP_LOGI(TAG, "Verifying chip revision of new image: %d", *(esp_chip_id_t *)event_data);
break;
case ESP_HTTPS_OTA_DECRYPT_CB: case ESP_HTTPS_OTA_DECRYPT_CB:
ESP_LOGI(TAG, "Callback to decrypt function"); ESP_LOGI(TAG, "Callback to decrypt function");
break; break;