From b24c062a3d55f27e6ddb46b07fda99cca43199ab Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 18 Feb 2019 16:59:06 +0100 Subject: [PATCH] firmware: bundle latest bootloader, replace it when needed --- SConscript.firmware | 9 +++ embed/bootloader/messages.c | 2 +- embed/firmware/bl_check.c | 84 ++++++++++++++++++++++++++++ embed/firmware/bl_check.h | 25 +++++++++ embed/firmware/bootloader.bin | Bin 0 -> 93696 bytes embed/firmware/bootloader_hashes.py | 20 +++++++ embed/firmware/main.c | 2 + embed/firmware/memory_T.ld | 2 + embed/trezorhal/flash.c | 3 +- embed/unix/flash.c | 2 +- 10 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 embed/firmware/bl_check.c create mode 100644 embed/firmware/bl_check.h create mode 100644 embed/firmware/bootloader.bin create mode 100755 embed/firmware/bootloader_hashes.py diff --git a/SConscript.firmware b/SConscript.firmware index 9bcdcca8e..7b66b6fa6 100644 --- a/SConscript.firmware +++ b/SConscript.firmware @@ -255,6 +255,7 @@ SOURCE_STMHAL = [ ] SOURCE_FIRMWARE = [ + 'embed/firmware/bl_check.c', 'embed/firmware/startup.s', 'embed/firmware/header.S', 'embed/firmware/main.c', @@ -426,6 +427,14 @@ obj_program.extend( ' --rename-section .data=.vendorheader,alloc,load,readonly,contents' ' $SOURCE $TARGET', )) +obj_program.extend( + env.Command( + target='embed/firmware/bootloader.o', + source='embed/firmware/bootloader.bin', + action='$OBJCOPY -I binary -O elf32-littlearm -B arm' + ' --rename-section .data=.bootloader' + ' $SOURCE $TARGET', )) + env.Depends(obj_program, qstr_generated) program_elf = env.Command( diff --git a/embed/bootloader/messages.c b/embed/bootloader/messages.c index 269215fe0..70cf066a1 100644 --- a/embed/bootloader/messages.c +++ b/embed/bootloader/messages.c @@ -310,7 +310,7 @@ void process_msg_FirmwareErase(uint8_t iface_num, uint32_t msg_size, uint8_t *bu MSG_RECV(FirmwareErase); firmware_remaining = msg_recv.has_length ? msg_recv.length : 0; - if ((firmware_remaining > 0) && ((firmware_remaining % 4) == 0) && (firmware_remaining <= (FIRMWARE_SECTORS_COUNT * IMAGE_CHUNK_SIZE))) { + if ((firmware_remaining > 0) && ((firmware_remaining % sizeof(uint32_t)) == 0) && (firmware_remaining <= (FIRMWARE_SECTORS_COUNT * IMAGE_CHUNK_SIZE))) { // request new firmware chunk_requested = (firmware_remaining > IMAGE_CHUNK_SIZE) ? IMAGE_CHUNK_SIZE : firmware_remaining; MSG_SEND_INIT(FirmwareRequest); diff --git a/embed/firmware/bl_check.c b/embed/firmware/bl_check.c new file mode 100644 index 000000000..d33095512 --- /dev/null +++ b/embed/firmware/bl_check.c @@ -0,0 +1,84 @@ +/* + * This file is part of the TREZOR project, https://trezor.io/ + * + * Copyright (c) SatoshiLabs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include "common.h" +#include "flash.h" +#include "blake2s.h" + +// symbols from bootloader.bin => bootloader.o +extern const uint32_t _binary_embed_firmware_bootloader_bin_start; +extern const uint32_t _binary_embed_firmware_bootloader_bin_size; + +/* +static secbool known_bootloader(const uint8_t *hash, int len) { + if (len != 32) return secfalse; + // bootloader-2.0.1.bin (padded with 0x00) + if (0 == memcmp(hash, "\x91\x37\x46\xd0\x2d\xa7\xc4\xbe\x1d\xae\xef\xb0\x9b\x4e\x31\x88\xed\x38\x23\x5e\x0e\x31\xa7\x8c\x01\xde\x4e\xcc\xc2\xd6\x36\xb3", 32)) return sectrue; + // bootloader-2.0.1.bin (padded with 0xff) + if (0 == memcmp(hash, "\x2f\xdb\xde\x94\x0a\xd8\x91\x1c\xbd\x07\xb0\xba\x06\x2c\x90\x84\x02\xec\x95\x19\xde\x52\x8d\x4b\xe9\xb9\xed\x30\x71\x91\xb4\xd3", 32)) return sectrue; + // bootloader-2.0.2.bin (padded with 0x00) + if (0 == memcmp(hash, "\x2e\xf7\x47\xf8\x49\x87\x1e\xc8\xc6\x01\x35\xd6\x32\xe5\x5a\xd1\x56\x18\xf8\x64\x87\xb7\xaa\x7c\x62\x0e\xc3\x0d\x25\x69\x4e\x18", 32)) return sectrue; + // bootloader-2.0.2.bin (padded with 0xff) + if (0 == memcmp(hash, "\xcc\x6b\x35\xc3\x8f\x29\x5c\xbd\x7d\x31\x69\xaf\xae\xf1\x61\x01\xef\xbe\x9f\x3b\x0a\xfd\xc5\x91\x70\x9b\xf5\xa0\xd5\xa4\xc5\xe0", 32)) return sectrue; + return secfalse; +} +*/ + +static secbool latest_bootloader(const uint8_t *hash, int len) { + if (len != 32) return secfalse; + // bootloader.bin (padded with 0x00) + if (0 == memcmp(hash, "\x2e\xf7\x47\xf8\x49\x87\x1e\xc8\xc6\x01\x35\xd6\x32\xe5\x5a\xd1\x56\x18\xf8\x64\x87\xb7\xaa\x7c\x62\x0e\xc3\x0d\x25\x69\x4e\x18", 32)) return sectrue; + // bootloader.bin (padded with 0xff) + if (0 == memcmp(hash, "\xcc\x6b\x35\xc3\x8f\x29\x5c\xbd\x7d\x31\x69\xaf\xae\xf1\x61\x01\xef\xbe\x9f\x3b\x0a\xfd\xc5\x91\x70\x9b\xf5\xa0\xd5\xa4\xc5\xe0", 32)) return sectrue; + return secfalse; +} + +#define BACKLIGHT_NORMAL 150 + +void check_and_replace_bootloader(void) +{ + // compute current bootloader hash + uint8_t hash[BLAKE2S_DIGEST_LENGTH]; + const uint32_t bl_len = 128 * 1024; + const void *bl_data = flash_get_address(FLASH_SECTOR_BOOTLOADER, 0, bl_len); + blake2s(bl_data, bl_len, hash, BLAKE2S_DIGEST_LENGTH); + + // don't whitelist the valid bootloaders for now + // ensure(known_bootloader(hash, BLAKE2S_DIGEST_LENGTH), "Unknown bootloader detected"); + + // do we have the latest bootloader? + if (sectrue == latest_bootloader(hash, BLAKE2S_DIGEST_LENGTH)) { + return; + } + + // replace bootloader with the latest one + const uint32_t *data = (const uint32_t *)&_binary_embed_firmware_bootloader_bin_start; + const uint32_t len = (const uint32_t)&_binary_embed_firmware_bootloader_bin_size; + ensure(flash_erase(FLASH_SECTOR_BOOTLOADER), NULL); + ensure(flash_unlock_write(), NULL); + for (int i = 0; i < len / sizeof(uint32_t); i++) { + ensure(flash_write_word(FLASH_SECTOR_BOOTLOADER, i * sizeof(uint32_t), data[i]), NULL); + } + for (int i = len / sizeof(uint32_t); i < 128 * 1024 / sizeof(uint32_t); i++) { + ensure(flash_write_word(FLASH_SECTOR_BOOTLOADER, i * sizeof(uint32_t), 0x00000000), NULL); + } + ensure(flash_lock_write(), NULL); +} diff --git a/embed/firmware/bl_check.h b/embed/firmware/bl_check.h new file mode 100644 index 000000000..9a03de493 --- /dev/null +++ b/embed/firmware/bl_check.h @@ -0,0 +1,25 @@ +/* + * This file is part of the TREZOR project, https://trezor.io/ + * + * Copyright (c) SatoshiLabs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __BL_CHECK_H__ +#define __BL_CHECK_H__ + +void check_and_replace_bootloader(void); + +#endif diff --git a/embed/firmware/bootloader.bin b/embed/firmware/bootloader.bin new file mode 100644 index 0000000000000000000000000000000000000000..4f34cb118c1a3f8ae01b05c14b7b2c8c93bd1183 GIT binary patch literal 93696 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 literal 0 HcmV?d00001 diff --git a/embed/firmware/bootloader_hashes.py b/embed/firmware/bootloader_hashes.py new file mode 100755 index 000000000..b2db0e1a2 --- /dev/null +++ b/embed/firmware/bootloader_hashes.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +import glob +import pyblake2 + +ALIGNED_SIZE = 128 * 1024 + +files = glob.glob("bootloader*.bin") + +for fn in sorted(files): + data = open(fn, "rb").read() + if len(data) > ALIGNED_SIZE: + raise ValueError(fn, "too big") + data_00 = data + b"\x00" * (ALIGNED_SIZE - len(data)) + data_ff = data + b"\xff" * (ALIGNED_SIZE - len(data)) + h_00 = pyblake2.blake2s(data=data_00).digest() + h_ff = pyblake2.blake2s(data=data_ff).digest() + h_00 = "".join(["\\x%02x" % i for i in h_00]) + h_ff = "".join(["\\x%02x" % i for i in h_ff]) + print(" // %s (padded with 0x00)\n if (0 == memcmp(hash, \"%s\", 32)) return sectrue;" % (fn, h_00)) + print(" // %s (padded with 0xff)\n if (0 == memcmp(hash, \"%s\", 32)) return sectrue;" % (fn, h_ff)) diff --git a/embed/firmware/main.c b/embed/firmware/main.c index 5b203ccc6..5d517fcc0 100644 --- a/embed/firmware/main.c +++ b/embed/firmware/main.c @@ -40,6 +40,7 @@ #include "rng.h" #include "sdcard.h" #include "touch.h" +#include "bl_check.h" int main(void) { @@ -51,6 +52,7 @@ int main(void) collect_hw_entropy(); #if TREZOR_MODEL == T + check_and_replace_bootloader(); // Enable MPU mpu_config(); #endif diff --git a/embed/firmware/memory_T.ld b/embed/firmware/memory_T.ld index 21faf01e8..e253c8ea3 100644 --- a/embed/firmware/memory_T.ld +++ b/embed/firmware/memory_T.ld @@ -53,6 +53,8 @@ SECTIONS { *(.text*); . = ALIGN(4); *(.rodata*); + . = ALIGN(4); + *(.bootloader*); . = ALIGN(512); } >FLASH AT>FLASH diff --git a/embed/trezorhal/flash.c b/embed/trezorhal/flash.c index 4df25c163..b270b7cc5 100644 --- a/embed/trezorhal/flash.c +++ b/embed/trezorhal/flash.c @@ -141,7 +141,7 @@ secbool flash_write_word(uint8_t sector, uint32_t offset, uint32_t data) if (address == 0) { return secfalse; } - if (offset % 4 != 0) { + if (offset % sizeof(uint32_t)) { // we write only at 4-byte boundary return secfalse; } if (data != (data & *((const uint32_t *)address))) { @@ -149,7 +149,6 @@ secbool flash_write_word(uint8_t sector, uint32_t offset, uint32_t data) } if (HAL_OK != HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data)) { return secfalse; - } if (data != *((const uint32_t *)address)) { return secfalse; diff --git a/embed/unix/flash.c b/embed/unix/flash.c index a76e6f2e4..4e68a9953 100644 --- a/embed/unix/flash.c +++ b/embed/unix/flash.c @@ -158,7 +158,7 @@ secbool flash_write_byte(uint8_t sector, uint32_t offset, uint8_t data) secbool flash_write_word(uint8_t sector, uint32_t offset, uint32_t data) { - if (offset % 4) { // we write only at 4-byte boundary + if (offset % sizeof(uint32_t)) { // we write only at 4-byte boundary return secfalse; } uint32_t *flash = (uint32_t *)flash_get_address(sector, offset, sizeof(data));