Simplifies Env upgrade API (#551)

* removes read_partition and partition_length from upgrade API

* renames partition to bundle, also data type change from slice to Vec

* removes hash from Env API

* fixes comment
This commit is contained in:
kaczmarczyck
2022-10-03 16:33:34 +02:00
committed by GitHub
parent 6610a29a67
commit 3c28ff49ee
5 changed files with 62 additions and 89 deletions

View File

@@ -352,18 +352,7 @@ impl TockUpgradeStorage {
}
impl UpgradeStorage for TockUpgradeStorage {
fn read_partition(&self, offset: usize, length: usize) -> StorageResult<&[u8]> {
if length == 0 {
return Err(StorageError::OutOfBounds);
}
if let Some(address) = self.partition.find_address(offset, length) {
Ok(unsafe { read_slice(address, length) })
} else {
Err(StorageError::OutOfBounds)
}
}
fn write_partition(&mut self, offset: usize, data: &[u8]) -> StorageResult<()> {
fn write_bundle(&mut self, offset: usize, data: Vec<u8>) -> StorageResult<()> {
if data.is_empty() {
return Err(StorageError::OutOfBounds);
}
@@ -382,23 +371,23 @@ impl UpgradeStorage for TockUpgradeStorage {
for address in write_range.aligned_iter(self.page_size) {
erase_page(address, self.page_size)?;
}
write_slice(address, data)?;
write_slice(address, &data)?;
let written_slice = unsafe { read_slice(address, data.len()) };
if written_slice != data {
return Err(StorageError::CustomError);
}
// Case: Last slice is written.
if data.len() == self.partition_length() - offset {
if data.len() == self.partition.length() - offset {
let metadata = unsafe { read_slice(self.metadata.start(), self.metadata.length()) };
self.check_partition_hash(&metadata)?;
}
Ok(())
}
fn partition_identifier(&self) -> u32 {
fn bundle_identifier(&self) -> u32 {
self.identifier
}
fn partition_length(&self) -> usize {
self.partition.length()
}
fn running_firmware_version(&self) -> u64 {
let running_metadata = unsafe {
read_slice(
@@ -438,7 +427,7 @@ fn check_metadata(
}
let metadata_address = LittleEndian::read_u32(&metadata[METADATA_SIGN_OFFSET + 8..][..4]);
if metadata_address != upgrade_locations.partition_identifier() {
if metadata_address != upgrade_locations.bundle_identifier() {
return Err(StorageError::CustomError);
}
@@ -495,13 +484,8 @@ mod test {
let mut metadata = vec![0xFF; METADATA_LEN];
LittleEndian::write_u32(&mut metadata[METADATA_SIGN_OFFSET + 8..][..4], 0x60000);
let partition_length = upgrade_locations.partition_length();
let mut signed_over_data = metadata[METADATA_SIGN_OFFSET..].to_vec();
signed_over_data.extend(
upgrade_locations
.read_partition(0, partition_length)
.unwrap(),
);
signed_over_data.extend(&[0xFF; 0x20000]);
let signed_hash = Sha256::hash(&signed_over_data);
metadata[..32].copy_from_slice(&signed_hash);