Skip to content

Commit

Permalink
SFT-4306: Remove panic on hash length.
Browse files Browse the repository at this point in the history
* extmod/foundation-rust/include/foundation.h: Re-generate file.
* extmod/foundation-rust/src/firmware.rs: Remove panic.
* ports/stm32/boards/Passport/modpassport.c: Handle new error.
  • Loading branch information
jeandudey committed Oct 17, 2024
1 parent f99ea66 commit ea997fc
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 2 deletions.
4 changes: 4 additions & 0 deletions extmod/foundation-rust/include/foundation.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,10 @@ typedef enum {
* Missing user public key
*/
FIRMWARE_RESULT_MISSING_USER_PUBLIC_KEY,
/**
* Invalid hash length
*/
FIRMWARE_RESULT_INVALID_HASH_LENGTH,
} FirmwareResult_Tag;

typedef struct {
Expand Down
11 changes: 9 additions & 2 deletions extmod/foundation-rust/src/firmware.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ pub enum FirmwareResult {
FailedSignature2,
/// Missing user public key
MissingUserPublicKey,
/// Invalid hash length
InvalidHashLength,
}

impl From<VerifyHeaderError> for FirmwareResult {
Expand Down Expand Up @@ -159,8 +161,13 @@ pub extern "C" fn verify_update_signatures(
result: &mut FirmwareResult,
) {
let header = unsafe { slice::from_raw_parts(header, header_len) };
let firmware_hash = sha256d::Hash::from_slice(hash)
.expect("hash should be of correct length");
let firmware_hash = match sha256d::Hash::from_slice(hash) {
Ok(v) => v,
Err(_) => {
*result = FirmwareResult::InvalidHashLength;
return;
}
};

let user_public_key = user_public_key
.map(|v| {
Expand Down
8 changes: 8 additions & 0 deletions ports/stm32/boards/Passport/modpassport.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,10 @@ STATIC mp_obj_t mod_passport_verify_update_header(mp_obj_t header) {
mp_raise_msg(&mp_type_InvalidFirmwareUpdate,
MP_ERROR_TEXT("Missing user public key"));
break;
case FIRMWARE_RESULT_INVALID_HASH_LENGTH:
mp_raise_msg(&mp_type_InvalidFirmwareUpdate,
MP_ERROR_TEXT("Invalid hash length"));
break;
default:
break;
}
Expand Down Expand Up @@ -248,6 +252,10 @@ STATIC mp_obj_t mod_passport_verify_update_signatures(mp_obj_t header, mp_obj_t
mp_raise_msg(&mp_type_InvalidFirmwareUpdate,
MP_ERROR_TEXT("Missing user public key"));
break;
case FIRMWARE_RESULT_INVALID_HASH_LENGTH:
mp_raise_msg(&mp_type_InvalidFirmwareUpdate,
MP_ERROR_TEXT("Invalid hash length"));
break;
default:
break;
}
Expand Down

0 comments on commit ea997fc

Please sign in to comment.