From a1984f32758763cd7a93c41e04a5a27a9f39fc2d Mon Sep 17 00:00:00 2001 From: matejcik Date: Fri, 29 Apr 2022 15:43:08 +0200 Subject: [PATCH] chore(legacy): release bootloader 1.11.0 --- legacy/bootloader/.changelog.d/1642.security | 1 - legacy/bootloader/.changelog.d/1884.fixed | 1 - legacy/bootloader/.changelog.d/2231.added | 1 - .../bootloader/.changelog.d/noissue.security | 1 - legacy/bootloader/CHANGELOG.md | 16 ++++++++++++++++ legacy/firmware/bl_check.c | 6 ++++++ legacy/firmware/bootloader.dat | Bin 32768 -> 32768 bytes 7 files changed, 22 insertions(+), 4 deletions(-) delete mode 100644 legacy/bootloader/.changelog.d/1642.security delete mode 100644 legacy/bootloader/.changelog.d/1884.fixed delete mode 100644 legacy/bootloader/.changelog.d/2231.added delete mode 100644 legacy/bootloader/.changelog.d/noissue.security diff --git a/legacy/bootloader/.changelog.d/1642.security b/legacy/bootloader/.changelog.d/1642.security deleted file mode 100644 index cc5ff3093..000000000 --- a/legacy/bootloader/.changelog.d/1642.security +++ /dev/null @@ -1 +0,0 @@ -Avoid accidental build with broken stack protector diff --git a/legacy/bootloader/.changelog.d/1884.fixed b/legacy/bootloader/.changelog.d/1884.fixed deleted file mode 100644 index 35202af07..000000000 --- a/legacy/bootloader/.changelog.d/1884.fixed +++ /dev/null @@ -1 +0,0 @@ -Compress firmware verification coordinates to be able link bootloader into preallocated space. diff --git a/legacy/bootloader/.changelog.d/2231.added b/legacy/bootloader/.changelog.d/2231.added deleted file mode 100644 index 2579a6a77..000000000 --- a/legacy/bootloader/.changelog.d/2231.added +++ /dev/null @@ -1 +0,0 @@ -Bootloader will report version of installed firmware. diff --git a/legacy/bootloader/.changelog.d/noissue.security b/legacy/bootloader/.changelog.d/noissue.security deleted file mode 100644 index a18706c01..000000000 --- a/legacy/bootloader/.changelog.d/noissue.security +++ /dev/null @@ -1 +0,0 @@ -Erase storage when downgrading below fix_version. diff --git a/legacy/bootloader/CHANGELOG.md b/legacy/bootloader/CHANGELOG.md index 8c3a9d756..ca0507070 100644 --- a/legacy/bootloader/CHANGELOG.md +++ b/legacy/bootloader/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 1.11.0 [May 2022] + +### Added +- Bootloader will report version of installed firmware. [#2231] + +### Fixed +- Compress firmware verification coordinates to be able link bootloader into preallocated space. [#1884] + +### Security +- Erase storage when downgrading below fix_version. +- Avoid accidental build with broken stack protector [#1642] + + ## 1.10.0 [May 2021] ### Added @@ -112,3 +125,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Initial import of code. [#1461]: https://github.com/trezor/trezor-firmware/pull/1461 +[#1642]: https://github.com/trezor/trezor-firmware/pull/1642 +[#1884]: https://github.com/trezor/trezor-firmware/pull/1884 +[#2231]: https://github.com/trezor/trezor-firmware/pull/2231 diff --git a/legacy/firmware/bl_check.c b/legacy/firmware/bl_check.c index d38cb8fa5..eeb5eb225 100644 --- a/legacy/firmware/bl_check.c +++ b/legacy/firmware/bl_check.c @@ -132,6 +132,12 @@ static int known_bootloader(int r, const uint8_t *hash) { "\xb9\xc7\xf6\x03\xcd\xc7\x30\xe7\x30\x78\x50\xa3\xf4\xd6\x2a\x5c", 32)) return 1; // 1.10.0 shipped with fw 1.10.0 + if (0 == + memcmp(hash, + "\xfa\x12\xa4\x4f\xa0\x5f\xd1\xd2\x05\x39\x35\x8b\x54\xf3\x01\xce" + "\xe4\xc3\x21\x9c\x9f\x1b\xb3\xa5\x77\x2f\xfd\x60\x9a\xf9\xe8\xe2", + 32)) + return 1; // 1.11.0 shipped with fw 1.11.1 return 0; } #endif diff --git a/legacy/firmware/bootloader.dat b/legacy/firmware/bootloader.dat index 604efd79583f22ad7e18903cfe9a2e098bdfc905..ac9d56f2307c80722bd3ca49998efa776cac2de7 100644 GIT binary patch delta 15558 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 V#a$?V>>j^$ecJz*|ClYh{{xJeGN}Ln delta 16270 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