From f49a6c3f1691dee86266b46877ea2483c51f9114 Mon Sep 17 00:00:00 2001 From: eupn Date: Mon, 10 Jul 2023 16:32:00 +0400 Subject: [PATCH 1/7] eeprom.h: remove unused EEPROM_EMPTY_TIMESTAMP --- ports/stm32/boards/Passport/include/eeprom.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/ports/stm32/boards/Passport/include/eeprom.h b/ports/stm32/boards/Passport/include/eeprom.h index 6c964a689..9a6cec92d 100644 --- a/ports/stm32/boards/Passport/include/eeprom.h +++ b/ports/stm32/boards/Passport/include/eeprom.h @@ -20,6 +20,4 @@ HAL_StatusTypeDef eeprom_write(uint16_t offset, uint8_t* buffer, uint8_t len); uint16_t eeprom_get_screen_brightness(uint16_t _default); bool eeprom_set_screen_brightness(uint16_t brightness); -#define EEPROM_EMPTY_TIMESTAMP (0xFFFFFFFF) - #endif /* __EEPROM_H__ */ \ No newline at end of file From 397a399d32153ed13bd17f1c1a1e324d8aa248a3 Mon Sep 17 00:00:00 2001 From: eupn Date: Mon, 10 Jul 2023 16:32:58 +0400 Subject: [PATCH 2/7] Fix compile errors in factory_test --- ports/stm32/boards/Passport/bootloader/ui.c | 26 ++++++++++----------- ports/stm32/boards/Passport/framebuffer.h | 2 +- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/ports/stm32/boards/Passport/bootloader/ui.c b/ports/stm32/boards/Passport/bootloader/ui.c index c3e52a14d..cfa9c6660 100644 --- a/ports/stm32/boards/Passport/bootloader/ui.c +++ b/ports/stm32/boards/Passport/bootloader/ui.c @@ -463,19 +463,17 @@ void ui_draw_wrapped_text(uint16_t x, uint16_t y, uint16_t max_width, char* text } // Show message and then delay or wait for button press -bool ui_show_message( - char* title, char* message, const lv_img_dsc_t* left_btn, const lv_img_dsc_t* right_btn, bool center) { +bool ui_show_message(char* title, char* message, char* left_btn, char* right_btn, bool center) { return ui_show_message_color(title, message, left_btn, right_btn, center, COLOR_BLACK, COLOR_WHITE); } -// Show message and then delay or wait for button press -bool ui_show_message_color(char* title, - char* message, - const lv_img_dsc_t* left_btn, - const lv_img_dsc_t* right_btn, - bool center, - uint16_t header_text_color, - uint16_t header_bg_color) { +bool ui_show_message_color(char* title, + char* message, + char* left_btn, + char* right_btn, + bool center, + uint16_t header_text_color, + uint16_t header_bg_color) { bool exit = false; bool result = false; bool is_left_pressed = false; @@ -555,15 +553,15 @@ void ui_show_fatal_error(char* error) { while (true) { if (show_error) { // Show the error - if (ui_show_message("Fatal Error", error, &ICON_EMAIL, &ICON_SHUTDOWN, true)) { + if (ui_show_message("Fatal Error", error, "Contact Us", "Shutdown", true)) { display_clean_shutdown(); } else { show_error = false; } } else { // Show Contact Info - if (ui_show_message("Contact", "\nContact us at:\n\nsupport@foundationdevices.com", &ICON_BACK, - &ICON_SHUTDOWN, true)) { + if (ui_show_message("Contact", "\nContact us at:\n\nsupport@foundationdevices.com", "Back", + "Shutdown", true)) { display_clean_shutdown(); } else { show_error = true; @@ -575,7 +573,7 @@ void ui_show_fatal_error(char* error) { void ui_show_hex_buffer(char* title, uint8_t* data, uint32_t length) { char buf[512]; bytes_to_hex_str(data, length, buf, 8, "\n"); - ui_show_message(title, buf, &ICON_SHUTDOWN, &ICON_CHECKMARK, true); + ui_show_message(title, buf, "Shutdown", "OK", true); } #endif /* FACTORY_TEST */ diff --git a/ports/stm32/boards/Passport/framebuffer.h b/ports/stm32/boards/Passport/framebuffer.h index 099cf19a8..758170195 100644 --- a/ports/stm32/boards/Passport/framebuffer.h +++ b/ports/stm32/boards/Passport/framebuffer.h @@ -7,7 +7,7 @@ #include -#include "lvgl/lvgl.h" +#include "lvgl.h" #if defined(SCREEN_MODE_MONO) && defined(SCREEN_MODE_COLOR) #error "SCREEN_MODE_MONO and SCREEN_MODE_COLOR cannot be used at the same time" From e24b64873d601baeb42edee37ac946778d148489 Mon Sep 17 00:00:00 2001 From: eupn Date: Thu, 13 Jul 2023 20:37:39 +0400 Subject: [PATCH 3/7] spiflash: add SCV routines --- ports/stm32/boards/Passport/common/spiflash.c | 27 +++++++++++++++++++ .../stm32/boards/Passport/include/spiflash.h | 4 +++ 2 files changed, 31 insertions(+) diff --git a/ports/stm32/boards/Passport/common/spiflash.c b/ports/stm32/boards/Passport/common/spiflash.c index 5bc9c4358..333629755 100644 --- a/ports/stm32/boards/Passport/common/spiflash.c +++ b/ports/stm32/boards/Passport/common/spiflash.c @@ -287,3 +287,30 @@ HAL_StatusTypeDef spi_sector_erase(uint32_t addr) { return rv; } + +#define SPI_ADDR_SCV_KEY (0x00000000) +#define SPI_SCV_KEY_SIZE (32) + +bool spi_get_scv_key(uint8_t* buf) { + if (spi_read(SPI_ADDR_SCV_KEY, SPI_SCV_KEY_SIZE, buf) == HAL_OK) { + return true; + } + + return false; +} + +bool spi_set_scv_key(uint8_t* buf) { + if (spi_write(SPI_ADDR_SCV_KEY, SPI_SCV_KEY_SIZE, buf) == HAL_OK) { + return true; + } + + return false; +} + +bool spi_clear_scv_key() { + if (spi_sector_erase(SPI_ADDR_SCV_KEY) == HAL_OK) { + return true; + } + + return false; +} diff --git a/ports/stm32/boards/Passport/include/spiflash.h b/ports/stm32/boards/Passport/include/spiflash.h index e36a552f8..e987f3f5d 100644 --- a/ports/stm32/boards/Passport/include/spiflash.h +++ b/ports/stm32/boards/Passport/include/spiflash.h @@ -24,4 +24,8 @@ extern HAL_StatusTypeDef spi_read_id(uint32_t *id_out); extern HAL_StatusTypeDef spi_chip_erase(void); extern HAL_StatusTypeDef spi_is_busy(bool* busy); +bool spi_get_scv_key(uint8_t* buf); +bool spi_set_scv_key(uint8_t* buf); +bool spi_clear_scv_key(); + #endif /* _SPIFLASH_H_ */ From c61ebffa06757f8a6b2cb6865c439a806b12cc71 Mon Sep 17 00:00:00 2001 From: eupn Date: Thu, 13 Jul 2023 20:38:16 +0400 Subject: [PATCH 4/7] factory-test.c: put SCV into SPI FLASH during the test --- .../boards/Passport/bootloader/factory-test.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ports/stm32/boards/Passport/bootloader/factory-test.c b/ports/stm32/boards/Passport/bootloader/factory-test.c index 9a5ff957e..30a441465 100644 --- a/ports/stm32/boards/Passport/bootloader/factory-test.c +++ b/ports/stm32/boards/Passport/bootloader/factory-test.c @@ -8,6 +8,7 @@ #include #include +#include "flash.h" #include "lvgl.h" #include "images.h" #include "backlight.h" @@ -591,6 +592,29 @@ void factory_test_external_flash(uint32_t param1, uint32_t param2) { return; } #endif /* if 0 */ + + // Copy SCV secret from a temporary location in MCU FLASH memory into the SPI FLASH + uint8_t* supply_chain_key = (uint8_t*)USER_SETTINGS_FLASH_ADDR; + bool is_erased = true; + for (uint32_t i = 0; i < 32; i++) { + if (supply_chain_key[i] != 0xFF) { + is_erased = false; + } + } + if (is_erased) { + factory_test_set_result_error(105, "SCV is empty"); + return; + } + + if (!spi_clear_scv_key()) { + factory_test_set_result_error(100, "Couldn't remove SCV key from SPI FLASH"); + return; + } + if (!spi_set_scv_key(supply_chain_key)) { + factory_test_set_result_error(105, "Failed to copy SCV to SPI FLASH"); + return; + } + if (spi_flash_deinit() != HAL_OK) { factory_test_set_result_error(100, "spi_deinit() failed"); return; From b365fc5044869fa78d0ce0c9739196e36fa76a72 Mon Sep 17 00:00:00 2001 From: eupn Date: Thu, 13 Jul 2023 20:39:13 +0400 Subject: [PATCH 5/7] se-atecc608a.c: read SCV from SPI FLASH --- .../boards/Passport/bootloader/se-atecc608a.c | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/ports/stm32/boards/Passport/bootloader/se-atecc608a.c b/ports/stm32/boards/Passport/bootloader/se-atecc608a.c index fd7097144..0b533eacb 100644 --- a/ports/stm32/boards/Passport/bootloader/se-atecc608a.c +++ b/ports/stm32/boards/Passport/bootloader/se-atecc608a.c @@ -11,6 +11,7 @@ #include #include +#include "spiflash.h" #include "flash.h" #include "hash.h" #include "pprng.h" @@ -195,16 +196,25 @@ int se_setup_config(rom_secrets_t* secrets) { break; case KEYNUM_supply_chain: { - // SCV key is in user settings flash - uint8_t* supply_chain_key = (uint8_t*)USER_SETTINGS_FLASH_ADDR; - bool is_erased = true; + if (spi_setup() != HAL_OK) { + return -11; + } + + // Read SCV key from the SPI FLASH + // It was written there by the factory test bootloader + uint8_t supply_chain_key[32] = {0xff,}; + if (!spi_get_scv_key(&supply_chain_key[0])) { + return -11; + } + + bool is_erased = true; for (uint32_t i = 0; i < 32; i++) { if (supply_chain_key[i] != 0xFF) { is_erased = false; } } - // If the scv key is not set in flash, then don't proceed, else validation will never work! + // If the scv key is not set in SPI flash, then don't proceed, else validation will never work! if (is_erased) { return -11; } @@ -212,7 +222,7 @@ int se_setup_config(rom_secrets_t* secrets) { int rc = se_write_data_slot(kn, supply_chain_key, 32, false); // Always erase the supply chain key, even if the write failed - flash_sector_erase(USER_SETTINGS_FLASH_ADDR); + spi_clear_scv_key(); if (rc) return -7; } break; From 208ac36b184166ced2ef0e1e33d67059f30233a2 Mon Sep 17 00:00:00 2001 From: eupn Date: Fri, 14 Jul 2023 23:04:50 +0400 Subject: [PATCH 6/7] bootloader: version bump 2.0 -> 2.1 --- ports/stm32/boards/Passport/bootloader/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/stm32/boards/Passport/bootloader/Makefile b/ports/stm32/boards/Passport/bootloader/Makefile index db9cd619d..fccef0971 100644 --- a/ports/stm32/boards/Passport/bootloader/Makefile +++ b/ports/stm32/boards/Passport/bootloader/Makefile @@ -14,7 +14,7 @@ include constants.mk -BOOTLOADER_VERSION = 2.0 +BOOTLOADER_VERSION = 2.1 # Toolchain TOOLCHAIN = arm-none-eabi- From 09d680e384eaa2e8a9c8be2e8c31584e72127759 Mon Sep 17 00:00:00 2001 From: eupn Date: Fri, 14 Jul 2023 23:15:28 +0400 Subject: [PATCH 7/7] framebuffer.h: don't use LVGL on mono --- ports/stm32/boards/Passport/framebuffer.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ports/stm32/boards/Passport/framebuffer.h b/ports/stm32/boards/Passport/framebuffer.h index 758170195..8aedfe065 100644 --- a/ports/stm32/boards/Passport/framebuffer.h +++ b/ports/stm32/boards/Passport/framebuffer.h @@ -7,7 +7,11 @@ #include +#ifdef SCREEN_MODE_COLOR #include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif #if defined(SCREEN_MODE_MONO) && defined(SCREEN_MODE_COLOR) #error "SCREEN_MODE_MONO and SCREEN_MODE_COLOR cannot be used at the same time"