1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-14 03:30:02 +00:00

bootloader: use ensure

This commit is contained in:
Pavol Rusnak 2017-10-13 18:05:47 +02:00
parent bdae87ddde
commit 204f0c55e4
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D

View File

@ -57,34 +57,6 @@ static const uint8_t * const BOOTLOADER_KEYS[] = {
void check_and_jump(void) void check_and_jump(void)
{ {
vendor_header vhdr;
if (!vendor_parse_header((const uint8_t *)FIRMWARE_START, &vhdr)) {
display_printf("invalid vendor header\n");
return;
}
if (!vendor_check_signature((const uint8_t *)FIRMWARE_START, &vhdr, BOOTLOADER_KEY_M, BOOTLOADER_KEY_N, BOOTLOADER_KEYS)) {
display_printf("invalid vendor header signature\n");
return;
}
image_header hdr;
if (!image_parse_header((const uint8_t *)(FIRMWARE_START + vhdr.hdrlen), IMAGE_MAGIC, IMAGE_MAXSIZE, &hdr)) {
display_printf("invalid firmware header\n");
return;
}
if (image_check_signature((const uint8_t *)(FIRMWARE_START + vhdr.hdrlen), &hdr, vhdr.vsig_m, vhdr.vsig_n, vhdr.vpub)) {
display_vendor(vhdr.vimg, (const char *)vhdr.vstr, vhdr.vstr_len, hdr.version);
if (vhdr.vtrust < 50) {
touch_click();
} else {
hal_delay(1000);
}
jump_to(FIRMWARE_START + vhdr.hdrlen + HEADER_SIZE);
} else {
display_printf("invalid firmware signature\n");
}
} }
int usb_init_all(void) { int usb_init_all(void) {
@ -135,7 +107,7 @@ int usb_init_all(void) {
return 0; return 0;
} }
void mainloop(void) void bootloader_loop(void)
{ {
ensure(0 == flash_init(), NULL); ensure(0 == flash_init(), NULL);
ensure(0 == usb_init_all(), NULL); ensure(0 == usb_init_all(), NULL);
@ -220,12 +192,39 @@ int main(void)
} }
if (touched != 0) { if (touched != 0) {
mainloop(); bootloader_loop();
} else { shutdown();
check_and_jump();
} }
ensure(0, "halt"); vendor_header vhdr;
ensure(
vendor_parse_header((const uint8_t *)FIRMWARE_START, &vhdr),
"invalid vendor header");
ensure(
vendor_check_signature((const uint8_t *)FIRMWARE_START, &vhdr, BOOTLOADER_KEY_M, BOOTLOADER_KEY_N, BOOTLOADER_KEYS),
"invalid vendor header signature");
image_header hdr;
ensure(
image_parse_header((const uint8_t *)(FIRMWARE_START + vhdr.hdrlen), IMAGE_MAGIC, IMAGE_MAXSIZE, &hdr),
"invalid firmware header");
ensure(
image_check_signature((const uint8_t *)(FIRMWARE_START + vhdr.hdrlen), &hdr, vhdr.vsig_m, vhdr.vsig_n, vhdr.vpub),
"invalid firmware signature");
display_vendor(vhdr.vimg, (const char *)vhdr.vstr, vhdr.vstr_len, hdr.version);
if (vhdr.vtrust < 50) {
display_text_center(120, 238, "click to continue ...", -1, FONT_BOLD, COLOR_GRAY64, COLOR_BLACK);
touch_click();
} else {
hal_delay(1000);
}
jump_to(FIRMWARE_START + vhdr.hdrlen + HEADER_SIZE);
return 0; return 0;
} }