Merge branch 'bugfix/preencrypted_ota_failed_with_partial_download_v5.0' into 'release/v5.0'

fix(esp_https_ota): fix preencrypted ota failed with pytest server and partial http enabled (v5.0)

See merge request espressif/esp-idf!27355
This commit is contained in:
Mahavir Jain 2023-12-15 17:47:52 +08:00
commit bd3cd0cc0c
3 changed files with 21 additions and 2 deletions

View File

@ -62,6 +62,7 @@ typedef struct {
#if CONFIG_ESP_HTTPS_OTA_DECRYPT_CB #if CONFIG_ESP_HTTPS_OTA_DECRYPT_CB
decrypt_cb_t decrypt_cb; /*!< Callback for external decryption layer */ decrypt_cb_t decrypt_cb; /*!< Callback for external decryption layer */
void *decrypt_user_ctx; /*!< User context for external decryption layer */ void *decrypt_user_ctx; /*!< User context for external decryption layer */
uint16_t enc_img_header_size; /*!< Header size of pre-encrypted ota image header */
#endif #endif
} esp_https_ota_config_t; } esp_https_ota_config_t;

View File

@ -48,6 +48,7 @@ struct esp_https_ota_handle {
#if CONFIG_ESP_HTTPS_OTA_DECRYPT_CB #if CONFIG_ESP_HTTPS_OTA_DECRYPT_CB
decrypt_cb_t decrypt_cb; decrypt_cb_t decrypt_cb;
void *decrypt_user_ctx; void *decrypt_user_ctx;
uint16_t enc_img_header_size;
#endif #endif
}; };
@ -306,6 +307,11 @@ esp_err_t esp_https_ota_begin(const esp_https_ota_config_t *ota_config, esp_http
} }
https_ota_handle->image_length = esp_http_client_get_content_length(https_ota_handle->http_client); https_ota_handle->image_length = esp_http_client_get_content_length(https_ota_handle->http_client);
#if CONFIG_ESP_HTTPS_OTA_DECRYPT_CB
/* In case of pre ecnrypted OTA, actual image size of OTA binary includes header size
which stored in variable enc_img_header_size*/
https_ota_handle->image_length -= ota_config->enc_img_header_size;
#endif
esp_http_client_close(https_ota_handle->http_client); esp_http_client_close(https_ota_handle->http_client);
if (https_ota_handle->image_length > https_ota_handle->max_http_request_size) { if (https_ota_handle->image_length > https_ota_handle->max_http_request_size) {
@ -332,6 +338,11 @@ esp_err_t esp_https_ota_begin(const esp_https_ota_config_t *ota_config, esp_http
if (!https_ota_handle->partial_http_download) { if (!https_ota_handle->partial_http_download) {
https_ota_handle->image_length = esp_http_client_get_content_length(https_ota_handle->http_client); https_ota_handle->image_length = esp_http_client_get_content_length(https_ota_handle->http_client);
#if CONFIG_ESP_HTTPS_OTA_DECRYPT_CB
/* In case of pre ecnrypted OTA, actual image size of OTA binary includes header size
which stored in variable enc_img_header_size*/
https_ota_handle->image_length -= ota_config->enc_img_header_size;
#endif
} }
https_ota_handle->update_partition = NULL; https_ota_handle->update_partition = NULL;
@ -359,6 +370,7 @@ esp_err_t esp_https_ota_begin(const esp_https_ota_config_t *ota_config, esp_http
} }
https_ota_handle->decrypt_cb = ota_config->decrypt_cb; https_ota_handle->decrypt_cb = ota_config->decrypt_cb;
https_ota_handle->decrypt_user_ctx = ota_config->decrypt_user_ctx; https_ota_handle->decrypt_user_ctx = ota_config->decrypt_user_ctx;
https_ota_handle->enc_img_header_size = ota_config->enc_img_header_size;
#endif #endif
https_ota_handle->ota_upgrade_buf_size = alloc_size; https_ota_handle->ota_upgrade_buf_size = alloc_size;
https_ota_handle->bulk_flash_erase = ota_config->bulk_flash_erase; https_ota_handle->bulk_flash_erase = ota_config->bulk_flash_erase;
@ -567,10 +579,14 @@ esp_err_t esp_https_ota_perform(esp_https_ota_handle_t https_ota_handle)
if (handle->state == ESP_HTTPS_OTA_IN_PROGRESS && handle->image_length > handle->binary_file_len) { if (handle->state == ESP_HTTPS_OTA_IN_PROGRESS && handle->image_length > handle->binary_file_len) {
esp_http_client_close(handle->http_client); esp_http_client_close(handle->http_client);
char *header_val = NULL; char *header_val = NULL;
int header_size = 0;
#if CONFIG_ESP_HTTPS_OTA_DECRYPT_CB
header_size = handle->enc_img_header_size;
#endif
if ((handle->image_length - handle->binary_file_len) > handle->max_http_request_size) { if ((handle->image_length - handle->binary_file_len) > handle->max_http_request_size) {
asprintf(&header_val, "bytes=%d-%d", handle->binary_file_len, (handle->binary_file_len + handle->max_http_request_size - 1)); asprintf(&header_val, "bytes=%d-%d", handle->binary_file_len + header_size, (handle->binary_file_len + header_size + handle->max_http_request_size - 1));
} else { } else {
asprintf(&header_val, "bytes=%d-", handle->binary_file_len); asprintf(&header_val, "bytes=%d-", handle->binary_file_len + header_size);
} }
if (header_val == NULL) { if (header_val == NULL) {
ESP_LOGE(TAG, "Failed to allocate memory for HTTP header"); ESP_LOGE(TAG, "Failed to allocate memory for HTTP header");

View File

@ -74,6 +74,7 @@ static esp_err_t _decrypt_cb(decrypt_cb_arg_t *args, void *user_ctx)
if (err != ESP_OK && err != ESP_ERR_NOT_FINISHED) { if (err != ESP_OK && err != ESP_ERR_NOT_FINISHED) {
return err; return err;
} }
static bool is_image_verified = false; static bool is_image_verified = false;
if (pargs.data_out_len > 0) { if (pargs.data_out_len > 0) {
args->data_out = pargs.data_out; args->data_out = pargs.data_out;
@ -143,6 +144,7 @@ void pre_encrypted_ota_task(void *pvParameter)
#endif #endif
.decrypt_cb = _decrypt_cb, .decrypt_cb = _decrypt_cb,
.decrypt_user_ctx = (void *)decrypt_handle, .decrypt_user_ctx = (void *)decrypt_handle,
.enc_img_header_size = esp_encrypted_img_get_header_size(),
}; };
esp_https_ota_handle_t https_ota_handle = NULL; esp_https_ota_handle_t https_ota_handle = NULL;