1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-02-02 19:01:04 +00:00

bootloader: do not show fingerprint on very first flash; refactor firmware_present, introduce brand_new_firmware

This commit is contained in:
Pavol Rusnak 2017-06-30 16:52:00 +02:00
parent 90d214eb4b
commit 0f42f64dfd
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D
4 changed files with 42 additions and 46 deletions

View File

@ -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);

View File

@ -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

View File

@ -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);
if (!brand_new_firmware) {
layoutFirmwareHash(hash); layoutFirmwareHash(hash);
do { do {
delay(100000); delay(100000);
buttonUpdate(); buttonUpdate();
} while (!button.YesUp && !button.NoUp); } while (!button.YesUp && !button.NoUp);
}
bool hash_check_ok = button.YesUp; 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();
} }
} }

View File

@ -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