1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-22 23:48:12 +00:00

bootloader: simplify vtrust code

This commit is contained in:
Pavol Rusnak 2017-12-15 20:53:29 +01:00
parent c0cd252c83
commit 7504366a02
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D
3 changed files with 41 additions and 28 deletions

View File

@ -141,6 +141,7 @@ Vendor trust is stored as bitmap where unset bit means the feature is active.
| 3 | 0x0008 | wait 8 seconds | | 3 | 0x0008 | wait 8 seconds |
| 4 | 0x0010 | use red background instead of black one | | 4 | 0x0010 | use red background instead of black one |
| 5 | 0x0020 | require user click | | 5 | 0x0020 | require user click |
| 6 | 0x0040 | show vendor string (not just the logo) |
### Firmware Header ### Firmware Header

View File

@ -85,13 +85,9 @@ static void display_welcome(secbool firmware_present)
#define VENDOR_IMAGE_RESX 120 #define VENDOR_IMAGE_RESX 120
#define VENDOR_IMAGE_RESY 120 #define VENDOR_IMAGE_RESY 120
static void display_vendor(const uint8_t *vimg, const char *vstr, uint32_t vstr_len, uint32_t fw_version, char red_background) static void display_vendor(const uint8_t *vimg, const char *vstr, uint32_t vstr_len, uint32_t fw_version, uint16_t background)
{ {
if (red_background) { display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, background);
display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_BL_RED);
} else {
display_clear();
}
if (memcmp(vimg, "TOIf", 4) != 0) { if (memcmp(vimg, "TOIf", 4) != 0) {
return; return;
} }
@ -102,7 +98,9 @@ static void display_vendor(const uint8_t *vimg, const char *vstr, uint32_t vstr_
} }
uint32_t datalen = *(uint32_t *)(vimg + 8); uint32_t datalen = *(uint32_t *)(vimg + 8);
display_image((DISPLAY_RESX - w) / 2, 32, w, h, vimg + 12, datalen); display_image((DISPLAY_RESX - w) / 2, 32, w, h, vimg + 12, datalen);
display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 48, vstr, vstr_len, FONT_BOLD, COLOR_WHITE, red_background ? COLOR_BL_RED : COLOR_BLACK); if (vstr && vstr_len) {
display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 48, vstr, vstr_len, FONT_BOLD, COLOR_WHITE, background);
}
char ver_str[32]; char ver_str[32];
mini_snprintf(ver_str, sizeof(ver_str), "%d.%d.%d.%d", mini_snprintf(ver_str, sizeof(ver_str), "%d.%d.%d.%d",
(int)(fw_version & 0xFF), (int)(fw_version & 0xFF),
@ -110,7 +108,7 @@ static void display_vendor(const uint8_t *vimg, const char *vstr, uint32_t vstr_
(int)((fw_version >> 16) & 0xFF), (int)((fw_version >> 16) & 0xFF),
(int)((fw_version >> 24) & 0xFF) (int)((fw_version >> 24) & 0xFF)
); );
display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 25, ver_str, -1, FONT_BOLD, COLOR_GRAY128, red_background ? COLOR_BL_RED : COLOR_BLACK); display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 25, ver_str, -1, FONT_BOLD, COLOR_GRAY128, background);
display_refresh(); display_refresh();
} }
@ -358,7 +356,18 @@ int main(void)
check_image_contents(&hdr, IMAGE_HEADER_SIZE + vhdr.hdrlen, sectors, 13), check_image_contents(&hdr, IMAGE_HEADER_SIZE + vhdr.hdrlen, sectors, 13),
"invalid firmware hash"); "invalid firmware hash");
display_vendor(vhdr.vimg, (const char *)vhdr.vstr, vhdr.vstr_len, hdr.version, (vhdr.vtrust & VTRUST_RED) == 0); // if all VTRUST flags are unset = ultimate trust => skip the procedure
if ((vhdr.vtrust & VTRUST_ALL) != VTRUST_ALL) {
display_vendor(
vhdr.vimg,
((vhdr.vtrust & VTRUST_STRING) == 0) ? (const char *)vhdr.vstr : 0,
((vhdr.vtrust & VTRUST_STRING) == 0) ? vhdr.vstr_len : 0,
hdr.version,
((vhdr.vtrust & VTRUST_RED) == 0) ? COLOR_BL_RED : COLOR_BLACK
);
display_fade(0, BACKLIGHT_NORMAL, 1000); display_fade(0, BACKLIGHT_NORMAL, 1000);
int start_delay = (vhdr.vtrust & VTRUST_WAIT) ^ VTRUST_WAIT; int start_delay = (vhdr.vtrust & VTRUST_WAIT) ^ VTRUST_WAIT;
@ -377,6 +386,7 @@ int main(void)
display_fade(BACKLIGHT_NORMAL, 0, 500); display_fade(BACKLIGHT_NORMAL, 0, 500);
display_clear(); display_clear();
}
jump_to(FIRMWARE_START + vhdr.hdrlen + IMAGE_HEADER_SIZE); jump_to(FIRMWARE_START + vhdr.hdrlen + IMAGE_HEADER_SIZE);

View File

@ -39,6 +39,8 @@ typedef struct {
#define VTRUST_WAIT 0x000F #define VTRUST_WAIT 0x000F
#define VTRUST_RED 0x0010 #define VTRUST_RED 0x0010
#define VTRUST_CLICK 0x0020 #define VTRUST_CLICK 0x0020
#define VTRUST_STRING 0x0040
#define VTRUST_ALL (VTRUST_WAIT | VTRUST_RED | VTRUST_CLICK | VTRUST_STRING)
typedef struct { typedef struct {
uint32_t magic; uint32_t magic;