diff --git a/CHANGELOG.md b/CHANGELOG.md index b381e44c..e7da34fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - `save-image` now checks if the ELF contains the app descriptor (#920) +- Add support for secure padding for save-image (#876) ### Changed diff --git a/cargo-espflash/src/main.rs b/cargo-espflash/src/main.rs index 41b1c7e9..dd5f7af9 100644 --- a/cargo-espflash/src/main.rs +++ b/cargo-espflash/src/main.rs @@ -373,6 +373,7 @@ fn flash(args: FlashArgs, config: &Config) -> Result<()> { config, chip, target_xtal_freq, + args.idf_format_args.secure_pad_v2, ); let image_format = make_image_format( &elf_data, @@ -643,6 +644,7 @@ fn save_image(args: SaveImageArgs, config: &Config) -> Result<()> { config, args.save_image_args.chip, xtal_freq, + args.idf_format_args.secure_pad_v2, ); let image_format = make_image_format( &elf_data, diff --git a/espflash/src/bin/espflash.rs b/espflash/src/bin/espflash.rs index bde23e8d..fd8c629e 100644 --- a/espflash/src/bin/espflash.rs +++ b/espflash/src/bin/espflash.rs @@ -286,6 +286,7 @@ fn flash(args: FlashArgs, config: &Config) -> Result<()> { config, chip, target_xtal_freq, + args.idf_format_args.secure_pad_v2, ); let image_format = make_image_format( &elf_data, @@ -370,6 +371,7 @@ fn save_image(args: SaveImageArgs, config: &Config) -> Result<()> { config, args.save_image_args.chip, xtal_freq, + args.idf_format_args.secure_pad_v2, ); let image_format = make_image_format( &elf_data, diff --git a/espflash/src/cli/mod.rs b/espflash/src/cli/mod.rs index e666ee54..a50596d3 100644 --- a/espflash/src/cli/mod.rs +++ b/espflash/src/cli/mod.rs @@ -279,6 +279,9 @@ pub struct IdfFormatArgs { /// Label of target app partition #[arg(long, value_name = "LABEL")] pub target_app_partition: Option, + /// Whether to apply padding for secure boot v2 + #[arg(long)] + pub secure_pad_v2: bool, } /// Arguments for connection and monitoring @@ -1100,6 +1103,7 @@ pub fn make_flash_data( config: &Config, chip: Chip, xtal_freq: XtalFrequency, + secure_pad_v2: bool, ) -> FlashData { // Create flash settings with precedence let mode = flash_config_args @@ -1121,6 +1125,7 @@ pub fn make_flash_data( image_args.mmu_page_size, chip, xtal_freq, + secure_pad_v2, ) } diff --git a/espflash/src/flasher/mod.rs b/espflash/src/flasher/mod.rs index 8cb0356a..48926c21 100644 --- a/espflash/src/flasher/mod.rs +++ b/espflash/src/flasher/mod.rs @@ -488,6 +488,8 @@ pub struct FlashData { pub chip: Chip, /// Crystal frequency. pub xtal_freq: XtalFrequency, + /// Whether to add secure boot V2 padding. + pub secure_pad_v2: bool, } impl FlashData { @@ -498,6 +500,7 @@ impl FlashData { mmu_page_size: Option, chip: Chip, xtal_freq: XtalFrequency, + secure_pad_v2: bool, ) -> Self { FlashData { flash_settings, @@ -505,6 +508,7 @@ impl FlashData { mmu_page_size, chip, xtal_freq, + secure_pad_v2, } } } diff --git a/espflash/src/image_format/idf.rs b/espflash/src/image_format/idf.rs index 7223b260..801ab562 100644 --- a/espflash/src/image_format/idf.rs +++ b/espflash/src/image_format/idf.rs @@ -514,6 +514,18 @@ impl<'a> IdfBootloaderFormat<'a> { segment_count += 1; } + if flash_data.secure_pad_v2 { + let current_size = data.len(); + let padding_size = (65536 - ((current_size + 56) % 65536)) % 65536; + let padding_bytes = vec![0; padding_size]; + let segment = Segment { + addr: 0, + data: Cow::Owned(padding_bytes), + }; + checksum = save_segment(&mut data, &segment, checksum)?; + segment_count += 1; + } + let padding = 15 - (data.len() % 16); let padding = &[0u8; 16][0..padding]; data.write_all(padding)?;