diff --git a/example_ota_ws/debug.log b/example_ota_ws/debug.log index e23ffc0..b121b81 100644 --- a/example_ota_ws/debug.log +++ b/example_ota_ws/debug.log @@ -1,3 +1,3 @@ -2023-10-04 18:54:18,808 - Debug Adapter (main) - CRITICAL - Debug adapter -> Extension: DEBUG_ADAPTER_STARTED -2023-10-04 18:54:18,809 - Debug Adapter (main) - CRITICAL - Debug adapter -> Extension: DEBUG_ADAPTER_READY2CONNECT -2023-10-04 18:57:36,086 - Debug Adapter (main) - CRITICAL - Debug adapter -> Extension: DEBUG_ADAPTER_STOPPED +2023-10-05 19:44:46,943 - Debug Adapter (main) - CRITICAL - Debug adapter -> Extension: DEBUG_ADAPTER_STARTED +2023-10-05 19:44:46,944 - Debug Adapter (main) - CRITICAL - Debug adapter -> Extension: DEBUG_ADAPTER_READY2CONNECT +2023-10-05 19:45:24,371 - Debug Adapter (main) - CRITICAL - Debug adapter -> Extension: DEBUG_ADAPTER_STOPPED diff --git a/rsa_key/private.pem b/rsa_key/private.pem index ea4ad28..2eadbed 100644 --- a/rsa_key/private.pem +++ b/rsa_key/private.pem @@ -1,40 +1,40 @@ -----BEGIN PRIVATE KEY----- -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 -JOa1q528gpwjG6xzEfw1bUI= +MIIG/gIBADANBgkqhkiG9w0BAQEFAASCBugwggbkAgEAAoIBgQDFmskeWxaJtPCV +Xydauqm6Q/wW9D0ewNUo+L9sopGz/Lrw5JdynLQDcxcioqpow5Nr9A8y8+YJc9zH +sMs4qJYDLcxROeimGlPqtrj4OxFXDyok12fxDquYTXaJzTAM+rp/i/VJJVKonYU0 +DOuG8tX1lsrlfkwYixaoPUGL/WuG1srHay5NKCcXjYVUKsjHkfEgfKAhF/6cPTj6 +yeKH6nNQQofOYUN5hkGgT19ek3or0dYph9r3VozyjV12/D1K+o0Vl+LQc7IX3xxN +DB9s3aGVIMglir8AY2ZjkqRyJRzbIrjufXYxw/e6uP2YQyBagEBWlsEhxKVsVOvi +O5fHfw+Svd9vgO3PRIA9bDh2isO6SHis6akgWBsXNh/FS1Kyl1IrBt+CnIsgQRzz +po7hh/TfU6VCKXL5fZR+fK6Ze12MP+B30HEXrW+VhzvhCMWjbyFIYJ1jGfd5N/zD +3E26cQPn711M+13cbKJeSWU0aX9dwQxPSXJdytORijxlFfUIAmsCAwEAAQKCAYA4 +3/9JJHCNPC4O4C9klttpSE4TkULSSjBQNaBrNTN4uaJY2YKZs27Am2yqRGWF99zD +sqB5SugICngeZc1oRmW/DnyDWIaU4HkM0oDUubOY+j1oEzPQlydek9Utfoh5A+WP +9omn/v0WmRgQzjMwSU65/Cfz+/ENE2N3EwJ9t3gufD4rPbc67/aoecxJWHMnteLQ +Ne6k99IJyDlRPbBc7Gc6T5vlE+um27Sh3paVkx8T47afh4HHtPqmiXfAWoONxCU7 +YXXWfIo4qB80it77QHtHdAgXxEZGug2WsDakf1bC/veZ0Qm4OkfkYzFF3DhRXTia +sffXdP6z+/nB+WG0k/qIqo5BweW3aOb+pyXATGTNVsRp98cxS6GpyZb3yUDnfiLL +vKzzMwPPJyA2X1cDVUrwTETg9jRB/UDTsYLjedar2FRkVI46lPZtvdqHLx5+UpDs +CEAooRaOi10LB52zhqhyKpy2VtsHXuhOLrGlj8R5DPGqzB9ZjlOLqsIxzXgT1+kC +gcEAzDxdkbY7xj1Q7HKOVQiRr45xijkL6kleglmBFt0DqFMETYzb4Y7xDEdU82H0 +XBlOnQIc6GD4PBGQDGGURSkQya7aSEWfIIRG3PCTCzSJhghPK+olFz5+39x/QUSm +zTY9rjIzAXu/VBSnFK+bL2A+etJOQFOrhfGESbWHsbuqPbigU5q9eCAcQs/GBI1F +x1ckjRCkUxpNS1jP92GWpIPVQQYd8IFwLfcA6nJq8UoXpIZazYfqeOOyN47ns7ho +TRhfAoHBAPewKcmEfikaTExIQKckN7rpfMJRmp3oWsq18AF6nywVYylhJPFo74Tw +6P/lsFJqjgCbN2bbMuw7vCq2a36tBy1rRFaNtRNjl8XjO3XP5RZG5Z9lUFA7Gvf+ +pY8qUIWzBWXVi/KugpAwNvy7rgYoqKZyUFOrm/4ehCz7uGD5OmpucEVPvOQIDYPe +cqF27iLXYiTJv20ASVnpmoF5XJaztQa2O9VSupTgxNGXi+iUz+azrIeUviTbOgZP +H5flbfyBdQKBwQCV4WsNhv3g4pijnQIlFy/K9S8PsAO1gPhxknuwqquHeLz8qHWo +1zzAtQx7vBQXDp9pi+ZpBtjFRGJBI88q3hMq3z3jsewwccKLW6WdoIWYLjrj0GY9 +46g6Ytekr1v112t2jfJukUD81Fc1UBYDs47GldXFUWHb3z0k1qppXX524yoNkM6g +/Heg9FeueXqO6r2xJFhjgDbfJ6MfOafSvcjfejy4hlUr9kvewe8HekdVfx/eG3OQ +GhFswlv5wUgR4+MCgcBaOJEAFoLd9fZU0vy55TdnniUToyXu3vQzYpJJ96CDLkcw +i3IpfU/B3P8CN2hCnQ2cqu1DShUCd7/Szx/YxK4YnToHTRboOR7PtjWydEe+FZUO +upjGoMDyFI+51m/+Q3dz4JVZkLd+ThG5faOmGqlT98/Kqnfn2LXMrOQ8bowYuKGs +nZ7wcP57Skv3BJs5lbrqK5LO4YvWdIETKGHRgyQtjbO9wKS2FimbLtiHn60bG9d8 +i3G3eyNnqOqZKbkmgQECgcEAgX9k4kDqK7IoNdk5Keypxvk5xUi+8rM2A52aRjer +m1a32/0EmV2+gggtg5h9K4xUdoaRfvnggx5XqMNoshp4Qm5nKu4bJavdO+us2HVA +urstNyvWaoQQJm26LAoG6u57DqmX6j0RnOUjL9OBgGiNDwqaek+QbqHSc0mrSH36 +Nfo9+XOssR7sZbNzKRGLlWGP1ham7QTjf6wkMFMYozBZZ96NgNbPW+gWd/kZlFCe +3YUVwrqlblfFYykcpa1p1llz -----END PRIVATE KEY----- diff --git a/source/ota_ws_update_esp_preencrypted.c b/source/ota_ws_update_esp_preencrypted.c index a127823..708d380 100644 --- a/source/ota_ws_update_esp_preencrypted.c +++ b/source/ota_ws_update_esp_preencrypted.c @@ -1,4 +1,4 @@ -/* +/* This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this @@ -16,7 +16,6 @@ openssl genrsa -out rsa_key/private.pem 3072 */ - #include "esp_ota_ops.h" #include "esp_flash_partitions.h" #include "esp_partition.h" @@ -29,30 +28,30 @@ static const char *TAG = "ota_ws_esp"; static const esp_partition_t *update_partition = NULL; static bool image_header_was_checked = false; -static esp_ota_handle_t update_handle = NULL; +static esp_ota_handle_t update_handle = 0; // pre-encrypted handle static esp_decrypt_handle_t enc_handle = NULL; // handle -static esp_decrypt_cfg_t enc_cfg = {0}; // cfg -static pre_enc_decrypt_arg_t enc_arg = {0}; // arg +static esp_decrypt_cfg_t enc_cfg = {0}; // cfg +static pre_enc_decrypt_arg_t enc_arg = {0}; // arg -static int tst_c=0; +// static int tst_c=0; extern const char rsa_private_pem_start[] asm("_binary_private_pem_start"); -extern const char rsa_private_pem_end[] asm("_binary_private_pem_end"); +extern const char rsa_private_pem_end[] asm("_binary_private_pem_end"); esp_err_t start_ota_ws(void) { - //return ESP_OK; // debug return - tst_c=0; + // return ESP_OK; // debug return + // tst_c=0; esp_err_t err; ESP_LOGI(TAG, "Starting OTA"); const esp_partition_t *configured = esp_ota_get_boot_partition(); const esp_partition_t *running = esp_ota_get_running_partition(); - if(configured==NULL || running == NULL) + if (configured == NULL || running == NULL) { - ESP_LOGE(TAG,"OTA data not found"); + ESP_LOGE(TAG, "OTA data not found"); return ESP_FAIL; } @@ -79,34 +78,34 @@ esp_err_t start_ota_ws(void) image_header_was_checked = false; enc_cfg.rsa_priv_key = rsa_private_pem_start; - enc_cfg.rsa_priv_key_len = rsa_private_pem_end-rsa_private_pem_start; + enc_cfg.rsa_priv_key_len = rsa_private_pem_end - rsa_private_pem_start; enc_handle = esp_encrypted_img_decrypt_start(&enc_cfg); - if(enc_handle == NULL) + if (enc_handle == NULL) { ESP_LOGE(TAG, "esp_encrypted_img_decrypt_start failed "); abort_ota_ws(); return ESP_FAIL; } - memset(&enc_arg,0,sizeof(pre_enc_decrypt_arg_t)); //?? + memset(&enc_arg, 0, sizeof(pre_enc_decrypt_arg_t)); //?? ESP_LOGI(TAG, "esp_ota_begin succeeded"); return ESP_OK; } esp_err_t write_ota_ws(int enc_data_read, uint8_t *enc_ota_write_data) { - //return ESP_OK; // debug return - enc_arg.data_in = (char*)enc_ota_write_data; + // return ESP_OK; // debug return + enc_arg.data_in = (char *)enc_ota_write_data; enc_arg.data_in_len = enc_data_read; esp_err_t ret = esp_encrypted_img_decrypt_data(enc_handle, &enc_arg); - ESP_LOGI("OTA ENC ","ret=%x len=%d",ret,enc_arg.data_out_len); - if(ret == ESP_FAIL || ret == ESP_ERR_INVALID_ARG) + // ESP_LOGI("OTA ENC ","ret=%x len=%d",ret,enc_arg.data_out_len); + if (ret == ESP_FAIL || ret == ESP_ERR_INVALID_ARG) { - ESP_LOGE(TAG, "data decrypt err %x",ret); - abort_ota_ws(); - return ret; + ESP_LOGE(TAG, "data decrypt err %x", ret); + abort_ota_ws(); + return ret; } int data_read = enc_arg.data_out_len; - uint8_t *ota_write_data = (uint8_t*)enc_arg.data_out; + uint8_t *ota_write_data = (uint8_t *)enc_arg.data_out; if (image_header_was_checked == false) // first segment { @@ -126,29 +125,31 @@ esp_err_t write_ota_ws(int enc_data_read, uint8_t *enc_ota_write_data) } } ret = esp_ota_write(update_handle, (const void *)ota_write_data, data_read); - tst_c += data_read; - ESP_LOGI("OTA WRITE","ret=%x len=%d tst_c=%d",ret,data_read,tst_c); + // tst_c += data_read; + // ESP_LOGI("OTA WRITE","ret=%x len=%d tst_c=%d",ret,data_read,tst_c); if (ret != ESP_OK) { ESP_LOGE(TAG, "esp_ota_write err"); abort_ota_ws(); return ret; } - return ESP_OK; + return ESP_OK; } esp_err_t end_ota_ws(void) { - //return ESP_OK; // debug return + // return ESP_OK; // debug return esp_err_t ret = esp_encrypted_img_decrypt_end(enc_handle); - if(ret) + if (ret) { ESP_LOGE(TAG, "esp_encrypted_img_decrypt_end (%s)!", esp_err_to_name(ret)); abort_ota_ws(); return ret; } ret = esp_ota_end(update_handle); - if (ret != ESP_OK) { - if (ret == ESP_ERR_OTA_VALIDATE_FAILED) { + if (ret != ESP_OK) + { + if (ret == ESP_ERR_OTA_VALIDATE_FAILED) + { ESP_LOGE(TAG, "Image validation failed, image is corrupted"); abort_ota_ws(); return ret; @@ -158,25 +159,36 @@ esp_err_t end_ota_ws(void) return ret; } ret = esp_ota_set_boot_partition(update_partition); - if (ret != ESP_OK) { + if (ret != ESP_OK) + { ESP_LOGE(TAG, "esp_ota_set_boot_partition failed (%s)!", esp_err_to_name(ret)); abort_ota_ws(); return ret; } - if(enc_arg.data_out) - { free(enc_arg.data_out);} - return ESP_OK; + if (enc_arg.data_out) + { + free(enc_arg.data_out); + } + return ESP_OK; } esp_err_t abort_ota_ws(void) { - if(enc_handle) - {esp_encrypted_img_decrypt_abort(enc_handle);} - if(update_handle) - {esp_ota_abort(update_handle);} + if (enc_handle) + { + ESP_LOGI("abort", "abort cmd"); + esp_encrypted_img_decrypt_abort(enc_handle); + } + if (update_handle) + { + esp_ota_abort(update_handle); + } + if (enc_arg.data_out) + { + free(enc_arg.data_out); + } enc_handle = NULL; - update_handle = NULL; - if(enc_arg.data_out) - { free(enc_arg.data_out);} + update_handle = 0; + memset(&enc_arg, 0, sizeof(pre_enc_decrypt_arg_t)); return ESP_OK; } // false - rollback disable @@ -186,21 +198,23 @@ bool check_ota_ws_rollback_enable(void) #ifdef CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE esp_ota_img_states_t ota_state_running_part; const esp_partition_t *running = esp_ota_get_running_partition(); - if (esp_ota_get_state_partition(running, &ota_state_running_part) == ESP_OK) { - if (ota_state_running_part == ESP_OTA_IMG_PENDING_VERIFY) { + if (esp_ota_get_state_partition(running, &ota_state_running_part) == ESP_OK) + { + if (ota_state_running_part == ESP_OTA_IMG_PENDING_VERIFY) + { ESP_LOGI(TAG, "Running app has ESP_OTA_IMG_PENDING_VERIFY state"); return true; } } #endif - return false; + return false; } // rollback == true - rollback // rollback == false - app valid? confirm update -> no rollback esp_err_t rollback_ota_ws(bool rollback) { #ifdef CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE - if(rollback == false) + if (rollback == false) { return esp_ota_mark_app_valid_cancel_rollback(); // app valid }