Skip to content

Commit 0253300

Browse files
Merge pull request #596 from Foundation-Devices/SFT-5260
SFT-5620: Check magic bytes correctly.
2 parents bef569c + 8ff2c97 commit 0253300

File tree

3 files changed

+39
-4
lines changed

3 files changed

+39
-4
lines changed

extmod/foundation-rust/include/foundation.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020

2121
#define VERSION_LEN 8
2222

23+
#define FIRMWARE_MAGIC_MONO 1346458451
24+
25+
#define FIRMWARE_MAGIC_COLOR 1397965136
26+
2327
/**
2428
* Maximum size of an encoded Uniform Resource.
2529
*
@@ -183,6 +187,7 @@ typedef enum {
183187

184188
typedef struct {
185189
char version[VERSION_LEN];
190+
uint32_t magic;
186191
bool signed_by_user;
187192
} FirmwareResult_HeaderOk_Body;
188193

extmod/foundation-rust/src/firmware.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@ use secp256k1::PublicKey;
99

1010
pub const VERSION_LEN: usize = 8;
1111

12+
// These are defined here as cbindgen does not support generating C
13+
// definitions for items outside of this crate.
14+
//
15+
// Note: keep in sync. with:
16+
//
17+
// - ports/stm32/boards/Passport/include/fwheader.h
18+
pub const FIRMWARE_MAGIC_MONO: u32 = 0x50415353;
19+
pub const FIRMWARE_MAGIC_COLOR: u32 = 0x53534150;
20+
1221
/// The result of the firmware update verification.
1322
/// cbindgen:rename-all=ScreamingSnakeCase
1423
/// cbindgen:prefix-with-name
@@ -18,6 +27,7 @@ pub enum FirmwareResult {
1827
/// The firmware validation succeed.
1928
HeaderOk {
2029
version: [c_char; VERSION_LEN],
30+
magic: u32,
2131
signed_by_user: bool,
2232
},
2333
/// The header format is not valid.
@@ -143,6 +153,7 @@ pub extern "C" fn verify_update_header(
143153

144154
*result = FirmwareResult::HeaderOk {
145155
version,
156+
magic: header.information.magic,
146157
signed_by_user: header.is_signed_by_user(),
147158
};
148159
}
@@ -208,5 +219,13 @@ mod tests {
208219
#[test]
209220
fn sanity_test() {
210221
assert_eq!(VERSION_LEN, foundation_firmware::VERSION_LEN);
222+
assert_eq!(
223+
FIRMWARE_MAGIC_MONO,
224+
foundation_firmware::Information::MAGIC_MONO
225+
);
226+
assert_eq!(
227+
FIRMWARE_MAGIC_COLOR,
228+
foundation_firmware::Information::MAGIC_COLOR
229+
);
211230
}
212231
}

ports/stm32/boards/Passport/modpassport.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@
1919
#include "se-config.h"
2020
#include "se.h"
2121

22+
#if defined(SCREEN_MODE_MONO)
23+
#define FIRMWARE_MAGIC FIRMWARE_MAGIC_MONO
24+
#elif defined(SCREEN_MODE_COLOR)
25+
#define FIRMWARE_MAGIC FIRMWARE_MAGIC_COLOR
26+
#endif
27+
2228
/// package: passport
2329

2430
STATIC MP_DEFINE_EXCEPTION(InvalidFirmwareUpdate, Exception);
@@ -86,24 +92,29 @@ STATIC mp_obj_t mod_passport_verify_update_header(mp_obj_t header) {
8692
header_info.len,
8793
firmware_timestamp,
8894
&result);
89-
9095
switch (result.tag) {
9196
case FIRMWARE_RESULT_HEADER_OK:
97+
if (result.HEADER_OK.magic != FIRMWARE_MAGIC) {
98+
mp_raise_msg(&mp_type_InvalidFirmwareUpdate,
99+
MP_ERROR_TEXT("The firmware is not for this device model."));
100+
}
101+
92102
tuple[0] = mp_obj_new_str_copy(&mp_type_str,
93103
(const uint8_t*)result.HEADER_OK.version,
94104
strlen((const char*)result.HEADER_OK.version));
95105
tuple[1] = result.HEADER_OK.signed_by_user ? mp_const_true : mp_const_false;
96106
return mp_obj_new_tuple(2, tuple);
97107
case FIRMWARE_RESULT_INVALID_HEADER:
98108
mp_raise_msg(&mp_type_InvalidFirmwareUpdate,
99-
MP_ERROR_TEXT("Invalid firmware header"));
109+
MP_ERROR_TEXT("Invalid firmware header."));
110+
break;
100111
case FIRMWARE_RESULT_UNKNOWN_MAGIC:
101112
mp_raise_msg(&mp_type_InvalidFirmwareUpdate,
102-
MP_ERROR_TEXT("Unknown firmware magic bytes"));
113+
MP_ERROR_TEXT("Unknown firmware magic bytes."));
103114
break;
104115
case FIRMWARE_RESULT_INVALID_TIMESTAMP:
105116
mp_raise_msg(&mp_type_InvalidFirmwareUpdate,
106-
MP_ERROR_TEXT("Invalid firmware timestamp"));
117+
MP_ERROR_TEXT("Invalid firmware timestamp."));
107118
break;
108119
case FIRMWARE_RESULT_TOO_SMALL:
109120
mp_raise_msg_varg(&mp_type_InvalidFirmwareUpdate,

0 commit comments

Comments
 (0)