mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-02 10:51:06 +00:00
bootloader: do not show fingerprint on very first flash; refactor firmware_present, introduce brand_new_firmware
This commit is contained in:
parent
90d214eb4b
commit
0f42f64dfd
@ -84,13 +84,27 @@ void load_app(void)
|
|||||||
(*(void (**)())(FLASH_APP_START + 4))();
|
(*(void (**)())(FLASH_APP_START + 4))();
|
||||||
}
|
}
|
||||||
|
|
||||||
int firmware_present;
|
bool firmware_present(void)
|
||||||
|
{
|
||||||
|
#ifndef APPVER
|
||||||
|
if (memcmp((const void *)FLASH_META_MAGIC, "TRZR", 4)) { // magic does not match
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (*((const uint32_t *)FLASH_META_CODELEN) < 4096) { // firmware reports smaller size than 4kB
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (*((const uint32_t *)FLASH_META_CODELEN) > FLASH_TOTAL_SIZE - (FLASH_APP_START - FLASH_ORIGIN)) { // firmware reports bigger size than flash size
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void bootloader_loop(void)
|
void bootloader_loop(void)
|
||||||
{
|
{
|
||||||
oledClear();
|
oledClear();
|
||||||
oledDrawBitmap(0, 0, &bmp_logo64);
|
oledDrawBitmap(0, 0, &bmp_logo64);
|
||||||
if (firmware_present) {
|
if (firmware_present()) {
|
||||||
oledDrawString(52, 0, "TREZOR");
|
oledDrawString(52, 0, "TREZOR");
|
||||||
static char serial[25];
|
static char serial[25];
|
||||||
fill_serialno_fixed(serial);
|
fill_serialno_fixed(serial);
|
||||||
@ -106,24 +120,7 @@ void bootloader_loop(void)
|
|||||||
}
|
}
|
||||||
oledRefresh();
|
oledRefresh();
|
||||||
|
|
||||||
usbInit();
|
usbLoop(firmware_present());
|
||||||
usbLoop();
|
|
||||||
}
|
|
||||||
|
|
||||||
int check_firmware_sanity(void)
|
|
||||||
{
|
|
||||||
#ifndef APPVER
|
|
||||||
if (memcmp((const void *)FLASH_META_MAGIC, "TRZR", 4)) { // magic does not match
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (*((const uint32_t *)FLASH_META_CODELEN) < 4096) { // firmware reports smaller size than 4kB
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (*((const uint32_t *)FLASH_META_CODELEN) > FLASH_TOTAL_SIZE - (FLASH_APP_START - FLASH_ORIGIN)) { // firmware reports bigger size than flash size
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t __stack_chk_guard;
|
uint32_t __stack_chk_guard;
|
||||||
@ -145,14 +142,12 @@ int main(void)
|
|||||||
oledInit();
|
oledInit();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
firmware_present = check_firmware_sanity();
|
|
||||||
|
|
||||||
#ifndef APPVER
|
#ifndef APPVER
|
||||||
// at least one button is unpressed
|
// at least one button is unpressed
|
||||||
uint16_t state = gpio_port_read(BTN_PORT);
|
uint16_t state = gpio_port_read(BTN_PORT);
|
||||||
int unpressed = ((state & BTN_PIN_YES) == BTN_PIN_YES || (state & BTN_PIN_NO) == BTN_PIN_NO);
|
int unpressed = ((state & BTN_PIN_YES) == BTN_PIN_YES || (state & BTN_PIN_NO) == BTN_PIN_NO);
|
||||||
|
|
||||||
if (firmware_present && unpressed) {
|
if (firmware_present() && unpressed) {
|
||||||
|
|
||||||
oledClear();
|
oledClear();
|
||||||
oledDrawBitmap(40, 0, &bmp_logo64_empty);
|
oledDrawBitmap(40, 0, &bmp_logo64_empty);
|
||||||
|
@ -31,8 +31,10 @@
|
|||||||
#define VERSION_MINOR_CHAR "\x03"
|
#define VERSION_MINOR_CHAR "\x03"
|
||||||
#define VERSION_PATCH_CHAR "\x01"
|
#define VERSION_PATCH_CHAR "\x01"
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
|
||||||
void layoutFirmwareHash(const uint8_t *hash);
|
void layoutFirmwareHash(const uint8_t *hash);
|
||||||
|
bool firmware_present(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -37,6 +37,8 @@
|
|||||||
#define ENDPOINT_ADDRESS_IN (0x81)
|
#define ENDPOINT_ADDRESS_IN (0x81)
|
||||||
#define ENDPOINT_ADDRESS_OUT (0x01)
|
#define ENDPOINT_ADDRESS_OUT (0x01)
|
||||||
|
|
||||||
|
static bool brand_new_firmware;
|
||||||
|
|
||||||
static const struct usb_device_descriptor dev_descr = {
|
static const struct usb_device_descriptor dev_descr = {
|
||||||
.bLength = USB_DT_DEVICE_SIZE,
|
.bLength = USB_DT_DEVICE_SIZE,
|
||||||
.bDescriptorType = USB_DT_DEVICE,
|
.bDescriptorType = USB_DT_DEVICE,
|
||||||
@ -214,8 +216,6 @@ static void send_msg_failure(usbd_device *dev)
|
|||||||
, 64) != 64) {}
|
, 64) != 64) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int firmware_present;
|
|
||||||
|
|
||||||
static void send_msg_features(usbd_device *dev)
|
static void send_msg_features(usbd_device *dev)
|
||||||
{
|
{
|
||||||
// response: Features message (id 17), payload len 30
|
// response: Features message (id 17), payload len 30
|
||||||
@ -225,7 +225,7 @@ static void send_msg_features(usbd_device *dev)
|
|||||||
// - patch_version = VERSION_PATCH
|
// - patch_version = VERSION_PATCH
|
||||||
// - bootloader_mode = True
|
// - bootloader_mode = True
|
||||||
// - firmware_present = True/False
|
// - firmware_present = True/False
|
||||||
if (firmware_present) {
|
if (brand_new_firmware) {
|
||||||
while ( usbd_ep_write_packet(dev, ENDPOINT_ADDRESS_IN,
|
while ( usbd_ep_write_packet(dev, ENDPOINT_ADDRESS_IN,
|
||||||
// header
|
// header
|
||||||
"?##"
|
"?##"
|
||||||
@ -239,7 +239,7 @@ static void send_msg_features(usbd_device *dev)
|
|||||||
"\x18" VERSION_MINOR_CHAR
|
"\x18" VERSION_MINOR_CHAR
|
||||||
"\x20" VERSION_PATCH_CHAR
|
"\x20" VERSION_PATCH_CHAR
|
||||||
"\x28" "\x01"
|
"\x28" "\x01"
|
||||||
"\x90\x01" "\x01"
|
"\x90\x01" "\x00"
|
||||||
// padding
|
// padding
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||||
, 64) != 64) {}
|
, 64) != 64) {}
|
||||||
@ -257,7 +257,7 @@ static void send_msg_features(usbd_device *dev)
|
|||||||
"\x18" VERSION_MINOR_CHAR
|
"\x18" VERSION_MINOR_CHAR
|
||||||
"\x20" VERSION_PATCH_CHAR
|
"\x20" VERSION_PATCH_CHAR
|
||||||
"\x28" "\x01"
|
"\x28" "\x01"
|
||||||
"\x90\x01" "\x00"
|
"\x90\x01" "\x01"
|
||||||
// padding
|
// padding
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||||
, 64) != 64) {}
|
, 64) != 64) {}
|
||||||
@ -380,14 +380,14 @@ static void hid_rx_callback(usbd_device *dev, uint8_t ep)
|
|||||||
|
|
||||||
if (flash_state == STATE_OPEN) {
|
if (flash_state == STATE_OPEN) {
|
||||||
if (msg_id == 0x0006) { // FirmwareErase message (id 6)
|
if (msg_id == 0x0006) { // FirmwareErase message (id 6)
|
||||||
if (firmware_present) {
|
if (!brand_new_firmware) {
|
||||||
layoutDialog(&bmp_icon_question, "Abort", "Continue", NULL, "Install new", "firmware?", NULL, "Never do this without", "your recovery card!", NULL);
|
layoutDialog(&bmp_icon_question, "Abort", "Continue", NULL, "Install new", "firmware?", NULL, "Never do this without", "your recovery card!", NULL);
|
||||||
do {
|
do {
|
||||||
delay(100000);
|
delay(100000);
|
||||||
buttonUpdate();
|
buttonUpdate();
|
||||||
} while (!button.YesUp && !button.NoUp);
|
} while (!button.YesUp && !button.NoUp);
|
||||||
}
|
}
|
||||||
if (!firmware_present || button.YesUp) {
|
if (brand_new_firmware || button.YesUp) {
|
||||||
// backup metadata
|
// backup metadata
|
||||||
backup_metadata(meta_backup);
|
backup_metadata(meta_backup);
|
||||||
flash_unlock();
|
flash_unlock();
|
||||||
@ -498,13 +498,16 @@ static void hid_rx_callback(usbd_device *dev, uint8_t ep)
|
|||||||
}
|
}
|
||||||
uint8_t hash[32];
|
uint8_t hash[32];
|
||||||
sha256_Final(&ctx, hash);
|
sha256_Final(&ctx, hash);
|
||||||
layoutFirmwareHash(hash);
|
|
||||||
do {
|
|
||||||
delay(100000);
|
|
||||||
buttonUpdate();
|
|
||||||
} while (!button.YesUp && !button.NoUp);
|
|
||||||
|
|
||||||
bool hash_check_ok = button.YesUp;
|
if (!brand_new_firmware) {
|
||||||
|
layoutFirmwareHash(hash);
|
||||||
|
do {
|
||||||
|
delay(100000);
|
||||||
|
buttonUpdate();
|
||||||
|
} while (!button.YesUp && !button.NoUp);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hash_check_ok = brand_new_firmware || button.YesUp;
|
||||||
|
|
||||||
layoutProgress("INSTALLING ... Please wait", 1000);
|
layoutProgress("INSTALLING ... Please wait", 1000);
|
||||||
uint8_t flags = *((uint8_t *)FLASH_META_FLAGS);
|
uint8_t flags = *((uint8_t *)FLASH_META_FLAGS);
|
||||||
@ -563,12 +566,6 @@ static void hid_set_config(usbd_device *dev, uint16_t wValue)
|
|||||||
static usbd_device *usbd_dev;
|
static usbd_device *usbd_dev;
|
||||||
static uint8_t usbd_control_buffer[128];
|
static uint8_t usbd_control_buffer[128];
|
||||||
|
|
||||||
void usbInit(void)
|
|
||||||
{
|
|
||||||
usbd_dev = usbd_init(&otgfs_usb_driver, &dev_descr, &config, usb_strings, 3, usbd_control_buffer, sizeof(usbd_control_buffer));
|
|
||||||
usbd_register_set_config_callback(usbd_dev, hid_set_config);
|
|
||||||
}
|
|
||||||
|
|
||||||
void checkButtons(void)
|
void checkButtons(void)
|
||||||
{
|
{
|
||||||
static bool btn_left = false, btn_right = false, btn_final = false;
|
static bool btn_left = false, btn_right = false, btn_final = false;
|
||||||
@ -598,11 +595,14 @@ void checkButtons(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void usbLoop(void)
|
void usbLoop(bool firmware_present)
|
||||||
{
|
{
|
||||||
|
brand_new_firmware = !firmware_present;
|
||||||
|
usbd_dev = usbd_init(&otgfs_usb_driver, &dev_descr, &config, usb_strings, 3, usbd_control_buffer, sizeof(usbd_control_buffer));
|
||||||
|
usbd_register_set_config_callback(usbd_dev, hid_set_config);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
usbd_poll(usbd_dev);
|
usbd_poll(usbd_dev);
|
||||||
if (!firmware_present && (flash_state == STATE_READY || flash_state == STATE_OPEN)) {
|
if (brand_new_firmware && (flash_state == STATE_READY || flash_state == STATE_OPEN)) {
|
||||||
checkButtons();
|
checkButtons();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
#ifndef __USB_H__
|
#ifndef __USB_H__
|
||||||
#define __USB_H__
|
#define __USB_H__
|
||||||
|
|
||||||
void usbInit(void);
|
void usbLoop(bool firmware_present);
|
||||||
void usbLoop(void);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user