From ecf1457522cfcd27bb4ddba676bbeb99c8c99c68 Mon Sep 17 00:00:00 2001 From: Igor Misic Date: Sun, 27 Mar 2022 21:41:18 +0200 Subject: [PATCH 1/2] flasher: add config version it will help with maintaining changes in the config --- flasher.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/flasher.cpp b/flasher.cpp index 24172b4..35d5a47 100755 --- a/flasher.cpp +++ b/flasher.cpp @@ -86,6 +86,7 @@ constexpr char kFakeBoardIdBase64[] = "Tk9UX1NFQ1VSRURfTUFHSUNfU1RSSU5HXzEyMzQ1N // Config constexpr char kConfigFileName[] = "config.json"; constexpr uint32_t kConfigOpenAttempt = 2; +constexpr char kConfigVersionStr[] = "config_version"; // Servers default config constexpr char kDefaultAddress1[] = "imtech.hr"; @@ -932,6 +933,13 @@ void Flasher::CreateDefaultConfigFile() { QJsonDocument json_data; QJsonObject json_object; + + QJsonObject json_object_version; + json_object_version.insert("major", "1"); + json_object_version.insert("minor", "0"); + json_object_version.insert("patch", "0"); + + json_object.insert(kConfigVersionStr, json_object_version); QJsonObject json_object_server_1; QJsonObject json_object_server_2; QJsonArray json_array; From da63d0d640927e8b7441bc033eb7c956c99e519c Mon Sep 17 00:00:00 2001 From: Igor Misic Date: Sun, 8 May 2022 22:39:23 +0200 Subject: [PATCH 2/2] flasher: add option to skip firmware signature with warning --- flasher.cpp | 31 ++++++++++++++++++++++++++----- flasher.h | 2 ++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/flasher.cpp b/flasher.cpp index 35d5a47..55915d0 100755 --- a/flasher.cpp +++ b/flasher.cpp @@ -87,6 +87,7 @@ constexpr char kFakeBoardIdBase64[] = "Tk9UX1NFQ1VSRURfTUFHSUNfU1RSSU5HXzEyMzQ1N constexpr char kConfigFileName[] = "config.json"; constexpr uint32_t kConfigOpenAttempt = 2; constexpr char kConfigVersionStr[] = "config_version"; +constexpr char kEnableSignatureWarningStr[] = "enable_signature_warning"; // Servers default config constexpr char kDefaultAddress1[] = "imtech.hr"; @@ -126,6 +127,10 @@ void Flasher::Init() { if (OpenConfigFile(json_document)) { QJsonArray servers_array = json_document.object().find("servers")->toArray(); socket_client_ = std::make_shared(servers_array); + + if (0 == QString::compare("true", json_document.object().find(kEnableSignatureWarningStr)->toString(), Qt::CaseInsensitive)) { + is_signature_warning_enabled_ = true; + } } file_downloader_ = std::make_unique(); @@ -469,9 +474,9 @@ void Flasher::LoopHandler() { FlashingInfo Flasher::Flash() { FlashingInfo flashing_info; - const qint64 firmware_size = file_content_.size() - kSignatureSize; + const qint64 firmware_size = file_content_.size() - signature_size_; const qint64 num_of_packets = (firmware_size / kPacketSize); - const char *data_firmware = file_content_.data() + kSignatureSize; + const char *data_firmware = file_content_.data() + signature_size_; // Send file in packages for (qint64 packet = 0; packet < num_of_packets; ++packet) { @@ -555,8 +560,8 @@ bool Flasher::CheckTrue() { FlashingInfo Flasher::CrcCheck() { FlashingInfo flashing_info; - const qint64 firmware_size = file_content_.size() - kSignatureSize; - const char *data_firmware = file_content_.data() + kSignatureSize; + const qint64 firmware_size = file_content_.size() - signature_size_; + const char *data_firmware = file_content_.data() + signature_size_; const uint8_t *data = reinterpret_cast(data_firmware); uint32_t crc = crc::CalculateCrc32(data, firmware_size, false, false); @@ -754,7 +759,7 @@ void Flasher::ReconnectingToBoard() { FlashingInfo Flasher::SendFileSize() { FlashingInfo flashing_info; - const qint64 firmware_size = file_content_.size() - kSignatureSize; + const qint64 firmware_size = file_content_.size() - signature_size_; QByteArray file_size; file_size.setNum(firmware_size); flashing_info.success = SendMessage(file_size.data(), file_size.size(), kSerialTimeoutInMs); @@ -775,7 +780,21 @@ bool Flasher::SendMessage(const char *data, qint64 length, int timeout_ms) { FlashingInfo Flasher::SendSignature() { FlashingInfo flashing_info; + signature_size_ = kSignatureSize; + flashing_info.success = SendMessage(file_content_.data(), kSignatureSize, kSerialTimeoutInMs); + if (!flashing_info.success) { + + bool continue_without_signature = true; + if (is_signature_warning_enabled_) { + continue_without_signature = ShowInfoMsg("No signature detected!", "Flashing without a signature is not safe. Flasher will assume that firmware is without signature."); + } + + if (continue_without_signature) { + signature_size_ = 0; + flashing_info.success = true; + } + } if (!flashing_info.success) { flashing_info.title = "Flashing process failed"; @@ -940,6 +959,8 @@ void Flasher::CreateDefaultConfigFile() { json_object_version.insert("patch", "0"); json_object.insert(kConfigVersionStr, json_object_version); + json_object.insert(kEnableSignatureWarningStr, "true"); + QJsonObject json_object_server_1; QJsonObject json_object_server_2; QJsonArray json_array; diff --git a/flasher.h b/flasher.h index f5f709e..732e051 100755 --- a/flasher.h +++ b/flasher.h @@ -324,12 +324,14 @@ class Flasher : public QObject { QString selected_firmware_version_; //!< Selected firmware version QFile config_file_; //!< Configuration file QFile firmware_file_; //!< Firmware file + qint64 signature_size_{0}; //!< Firmware signature size bool is_bootloader_ {false}; //!< Is bootloader detected flag bool is_bootloader_expected_ {false}; //!< Is bootloader expected after board reset bool is_read_protection_enabled_ {false}; //!< Is read protection enabled flag bool is_timer_started_ {false}; //!< Is timer started flag bool is_firmware_downloaded_{false}; //!< Is firmware downloaded flag bool is_download_success_{false}; //!< Is download successfully done + bool is_signature_warning_enabled_{false}; //!< Is signature warning enabled QByteArray file_content_; //!< File content communication::SerialPort serial_port_; //!< Serial port object std::shared_ptr socket_client_; //!< Pointer to SocketClient object